• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zjsxwc
V2EX  ›  程序员

崩潰,在 Linux 下用 Golang 寫了程序,想移到 Windows 下也能運行,但被目錄轉化搞得放棄

  •  
  •   zjsxwc ·
    zjsxwc · Oct 27, 2018 · 5726 views
    This topic created in 2780 days ago, the information mentioned may be changed or developed.

    一會 C:\User 一會C:\\User 一會 C:/User

    改得我腦門疼,水平有限,精力不夠最終還是放棄 Windows

    Supplement 1  ·  Oct 27, 2018
    一直個鬼,我 windows 下開虛擬機搞定了 23333
    42 replies    2018-10-29 10:14:09 +08:00
    flynaj
        1
    flynaj  
       Oct 27, 2018 via Android
    相对目录
    zjsxwc
        2
    zjsxwc  
    OP
       Oct 27, 2018
    @flynaj 相對目錄也存在 `\\` `\` `/` 的區別。
    serical
        3
    serical  
       Oct 27, 2018 via Android
    做成配置文件的方式,不同系统配置不同的
    liaohongxing
        4
    liaohongxing  
       Oct 27, 2018   ❤️ 3
    一般跨平台语言都有提供 路径分隔符 标志 如 java 的 File.separator,php 的 DIRECTORY_SEPARATOR 常量 ,写跨平台程序路径肯定要用 这些 标志来拼接 ,否则肯定有路径问题。
    loading
        5
    loading  
       Oct 27, 2018 via Android
    这个路径分隔符能在程序启动时获取存到一个常量里吧。
    我忘了我这样处理的程序是 python 还是 golang 了。
    flynaj
        6
    flynaj  
       Oct 27, 2018 via Android
    @serical 对程序里面根本不需要路径,写在配置文件,或者参数里面。
    zjsxwc
        7
    zjsxwc  
    OP
       Oct 27, 2018
    @liaohongxing
    @loading

    這些只是其中之一的問題,我還要把涉及的自動生成的 shell 腳本轉化爲 bat 腳本,工作量有點大改了一晚上碰到各種坑,有幾個三方包里面還碰到用到不支持 windows 的 syscall,我剛開始還想把這些 syscall 改兼容,改了半天還是各種坑不斷出現,反正我放棄里!!!!
    watzds
        8
    watzds  
       Oct 27, 2018 via Android
    这和 go 没啥关系, `\\` `\` `/`其他语言也差不多,一个转义,两个不同分隔符
    iwtbauh
        9
    iwtbauh  
       Oct 27, 2018 via Android   ❤️ 1
    @zjsxwc #7

    msys2 了解一下?用 msys2 移植可以简化绝大部分的工作量

    shell 脚本直接跑。

    msys2 实现了 posix API (不要用 msys2 带的 mingw,那个没有 posix 支持)

    包括 GTK+等程序都可以无痛移植
    BBCCBB
        10
    BBCCBB  
       Oct 27, 2018
    filepath. ToSlash()
    junjieyuanxiling
        11
    junjieyuanxiling  
       Oct 27, 2018 via Android
    @loading Python 有 os.sep 。
    kidlj
        12
    kidlj  
       Oct 27, 2018 via iPhone
    标准库里的 log/syslog 才牛逼,Windows 上怎么编译都报错 undefined,后来一查 stackoverflow,不支持 Windows。那你还放到标准库里?
    Trim21
        13
    Trim21  
       Oct 28, 2018 via Android   ❤️ 5
    今天写 golang 用到 path.IsAbs,发现 Windows 下的路径怎么传结果都是 false,看了一眼源码,就判断了字符串第一个字符是不是“/”…
    veightz
        14
    veightz  
       Oct 28, 2018
    @Trim21 真是令人窒息的操作。。
    zwh2698
        15
    zwh2698  
       Oct 28, 2018 via Android
    路径前缀,你可以配置,也可以 api 获取,/ Windows 兼容所以不用改
    zealzz
        16
    zealzz  
       Oct 28, 2018 via Android
    兄弟,join 方法了解一下了,既然语言做到了跨平台,就肯定会处理这些差异啊。手动拼路径是一件多么傻的是啊。
    ethusdt
        17
    ethusdt  
       Oct 28, 2018
    yulon
        18
    yulon  
       Oct 28, 2018
    Go 不是有 filepath 包吗,任何语言在标准库支持处理路径的情况下都不要手写路径分隔符,JS 也是同理啊。。。
    leyle
        19
    leyle  
       Oct 28, 2018
    @Trim21 #13 这么骚操作?
    mengzhuo
        20
    mengzhuo  
       Oct 28, 2018 via Android
    @Trim21 可以报 bug 了
    SuperMild
        21
    SuperMild  
       Oct 28, 2018
    @ #13

    文档概述一共就两三句话也不看吗。涉及系统路径的 api,第一反应就是可能不跨平台需要看文档确认一下。另外上面有人说不跨平台就不能入标准库,是不是各种语言标准库了解得太少,不跨平台很正常的。

    Package path

    This package does not deal with Windows paths with drive letters or backslashes; to manipulate operating system paths, use the path/filepath package.
    Cbdy
        22
    Cbdy  
       Oct 28, 2018 via Android
    Go 难道没有类似 Java 的 File、Path 这样的 API 吗?
    jhdxr
        23
    jhdxr  
       Oct 28, 2018
    @SuperMild 恕我孤陋寡闻,我想了一下,java / php / python / nodejs 之类的涉及到路径的 api,好像都是可以跨平台的吧? go 用户有时候最好跳出井看一眼现在外面的世界是啥样了。。。
    feverzsj
        24
    feverzsj  
       Oct 28, 2018
    别人跨平台用 go 都很顺,只能说是 lz 自己的问题
    trait
        25
    trait  
       Oct 28, 2018
    @SuperMild 额 不能 go 不入 std 就说正常操作吧,几乎同时期出生的 rust 的 path 都是跨平台
    SuperMild
        26
    SuperMild  
       Oct 28, 2018
    @jhdxr
    @trait

    go 里的 path 也有跨平台的 api,比如 filepath.IsAbs

    以 python, nodejs 为例,它们有不跨平台的 low level api,也有跨平台的 high level api,这在 go 里也是类似的。

    路径涉及平台的根本性区别,其中有的部分必然在不同平台有不同的处理,python, nodejs 关于 path 的文档里每几行就来一句 "但在 windoows 里是这样的……", nodejs 的 path 文档第一节就是 “ Windows vs. POSIX ”,不可视而不见。
    congeec
        27
    congeec  
       Oct 28, 2018 via iPhone
    #8 正解 现代语言里基本都有 raw string 吧
    aru
        28
    aru  
       Oct 28, 2018
    windows 7 以上可以用 c://windows/system32/ 这样的路径表示方式
    reus
        29
    reus  
       Oct 28, 2018
    @kidlj 标准库里有平台相关的,有什么问题?你 windows 垃圾,怪别人了?
    reus
        30
    reus  
       Oct 28, 2018
    @Trim21 要用 filepath 包,不是 path
    reus
        31
    reus  
       Oct 28, 2018
    @mengzhuo path 包就是只有 / 的,平台相关的需要用 path/filepath 这个
    reus
        32
    reus  
       Oct 28, 2018   ❤️ 1
    @jhdxr go 标准库有跨平台的路径处理包,他给出的文档里都写了“ to manipulate operating system paths, use the path/filepath package.”,你连读都不读,就敢叫人“跳出井口”?难道不是你自己的问题???
    rrfeng
        33
    rrfeng  
       Oct 28, 2018
    import "path/filepath"
    Kisesy
        34
    Kisesy  
       Oct 28, 2018
    奇怪的问题,事实上我这里这样写都是正常的
    path := "c://aaa/abc\\cde/////xxx\\\\aaa"
    os.MkdirAll(path, 0666)
    os.Create(filepath.Join(path, "a.txt"))
    auin
        35
    auin  
       Oct 28, 2018
    其实现在不用管正反,一律用“/”,反正兼容
    Kisesy
        36
    Kisesy  
       Oct 28, 2018
    @Kisesy 或者直接拼接也可以 os.Create(path + "/" + "a.txt")
    hansnow
        37
    hansnow  
       Oct 28, 2018
    @Kisesy #36 更合适的做法是 filepath.Join(path, "a.txt")得到更稳定的路径吧?
    cpdyj0
        38
    cpdyj0  
       Oct 28, 2018
    标准库不会自动处理这些问题吗,我记得 Java 好像是可以的
    Kisesy
        39
    Kisesy  
       Oct 28, 2018   ❤️ 1
    @hansnow 是的,但是 Join 会默认调用 Clean,会格式化为 c:\aaa\abc\cde\xxx\aaa\a.txt ,这样就不能证明系统或者编程语言其实是支持混乱的分隔符的了
    raptor
        40
    raptor  
       Oct 28, 2018
    还是那句话,珍爱生命,远离微软
    ps1aniuge
        41
    ps1aniuge  
       Oct 28, 2018
    楼主开发 win,linux,mac 通用的命令行程序,我建议用 powershell。
    powershell 有 join-path 命令。

    问:powershell 如何合并目录,文件?
    答:
    join-path

    linux 中
    $a = '/root'
    $b = 'abc.txt'
    $c = join-path -Path $a -ChildPath $b
    $c #/root/abc.txt


    win 中
    $a = 'e:\temp8'
    $b = 'abc.txt'
    $c = join-path -Path $a -ChildPath $b
    $c #e:\temp8\abc.txt


    我帮楼主解决问题,也希望楼主能帮我解决问题。
    我的问题是:
    光棍节,把你的购物车,中的商品,推荐给我,我不知买啥好。

    珍爱生命,远离 bat,bash。这 2 货 很多年基本不更新了。
    多用 powershell 这把屠龙刀。
    CharlieBrown
        42
    CharlieBrown  
       Oct 29, 2018
    python 中有 os.sep
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5537 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 07:50 · PVG 15:50 · LAX 00:50 · JFK 03:50
    ♥ Do have faith in what you're doing.