V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjsxwc
V2EX  ›  程序员

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

  •  
  •   zjsxwc ·
    zjsxwc · 2018-10-27 20:55:40 +08:00 · 5161 次点击
    这是一个创建于 2211 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    shell 脚本直接跑。

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

    包括 GTK+等程序都可以无痛移植
    BBCCBB
        10
    BBCCBB  
       2018-10-27 21:46:32 +08:00
    filepath. ToSlash()
    junjieyuanxiling
        11
    junjieyuanxiling  
       2018-10-27 21:55:04 +08:00 via Android
    @loading Python 有 os.sep 。
    kidlj
        12
    kidlj  
       2018-10-27 23:40:18 +08:00 via iPhone
    标准库里的 log/syslog 才牛逼,Windows 上怎么编译都报错 undefined,后来一查 stackoverflow,不支持 Windows。那你还放到标准库里?
    Trim21
        13
    Trim21  
       2018-10-28 02:06:29 +08:00 via Android   ❤️ 5
    今天写 golang 用到 path.IsAbs,发现 Windows 下的路径怎么传结果都是 false,看了一眼源码,就判断了字符串第一个字符是不是“/”…
    veightz
        14
    veightz  
       2018-10-28 02:15:12 +08:00
    @Trim21 真是令人窒息的操作。。
    zwh2698
        15
    zwh2698  
       2018-10-28 06:46:49 +08:00 via Android
    路径前缀,你可以配置,也可以 api 获取,/ Windows 兼容所以不用改
    zealzz
        16
    zealzz  
       2018-10-28 06:55:11 +08:00 via Android
    兄弟,join 方法了解一下了,既然语言做到了跨平台,就肯定会处理这些差异啊。手动拼路径是一件多么傻的是啊。
    FaiChou
        17
    FaiChou  
       2018-10-28 08:40:22 +08:00
    yulon
        18
    yulon  
       2018-10-28 08:56:40 +08:00
    Go 不是有 filepath 包吗,任何语言在标准库支持处理路径的情况下都不要手写路径分隔符,JS 也是同理啊。。。
    leyle
        19
    leyle  
       2018-10-28 09:52:58 +08:00
    @Trim21 #13 这么骚操作?
    mengzhuo
        20
    mengzhuo  
       2018-10-28 10:21:52 +08:00 via Android
    @Trim21 可以报 bug 了
    SuperMild
        21
    SuperMild  
       2018-10-28 10:25:37 +08:00
    @ #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  
       2018-10-28 10:31:07 +08:00 via Android
    Go 难道没有类似 Java 的 File、Path 这样的 API 吗?
    jhdxr
        23
    jhdxr  
       2018-10-28 10:36:27 +08:00
    @SuperMild 恕我孤陋寡闻,我想了一下,java / php / python / nodejs 之类的涉及到路径的 api,好像都是可以跨平台的吧? go 用户有时候最好跳出井看一眼现在外面的世界是啥样了。。。
    feverzsj
        24
    feverzsj  
       2018-10-28 10:43:02 +08:00
    别人跨平台用 go 都很顺,只能说是 lz 自己的问题
    trait
        25
    trait  
       2018-10-28 10:46:09 +08:00
    @SuperMild 额 不能 go 不入 std 就说正常操作吧,几乎同时期出生的 rust 的 path 都是跨平台
    SuperMild
        26
    SuperMild  
       2018-10-28 11:13:42 +08:00
    @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  
       2018-10-28 11:14:20 +08:00 via iPhone
    #8 正解 现代语言里基本都有 raw string 吧
    aru
        28
    aru  
       2018-10-28 11:16:38 +08:00
    windows 7 以上可以用 c://windows/system32/ 这样的路径表示方式
    reus
        29
    reus  
       2018-10-28 11:24:43 +08:00
    @kidlj 标准库里有平台相关的,有什么问题?你 windows 垃圾,怪别人了?
    reus
        30
    reus  
       2018-10-28 11:25:02 +08:00
    @Trim21 要用 filepath 包,不是 path
    reus
        31
    reus  
       2018-10-28 11:25:50 +08:00
    @mengzhuo path 包就是只有 / 的,平台相关的需要用 path/filepath 这个
    reus
        32
    reus  
       2018-10-28 11:29:30 +08:00   ❤️ 1
    @jhdxr go 标准库有跨平台的路径处理包,他给出的文档里都写了“ to manipulate operating system paths, use the path/filepath package.”,你连读都不读,就敢叫人“跳出井口”?难道不是你自己的问题???
    rrfeng
        33
    rrfeng  
       2018-10-28 12:15:31 +08:00
    import "path/filepath"
    Kisesy
        34
    Kisesy  
       2018-10-28 12:41:21 +08:00
    奇怪的问题,事实上我这里这样写都是正常的
    path := "c://aaa/abc\\cde/////xxx\\\\aaa"
    os.MkdirAll(path, 0666)
    os.Create(filepath.Join(path, "a.txt"))
    liuxey
        35
    liuxey  
       2018-10-28 12:41:45 +08:00
    其实现在不用管正反,一律用“/”,反正兼容
    Kisesy
        36
    Kisesy  
       2018-10-28 12:43:26 +08:00
    @Kisesy 或者直接拼接也可以 os.Create(path + "/" + "a.txt")
    hansnow
        37
    hansnow  
       2018-10-28 13:51:28 +08:00
    @Kisesy #36 更合适的做法是 filepath.Join(path, "a.txt")得到更稳定的路径吧?
    cpdyj0
        38
    cpdyj0  
       2018-10-28 13:55:40 +08:00
    标准库不会自动处理这些问题吗,我记得 Java 好像是可以的
    Kisesy
        39
    Kisesy  
       2018-10-28 14:45:12 +08:00   ❤️ 1
    @hansnow 是的,但是 Join 会默认调用 Clean,会格式化为 c:\aaa\abc\cde\xxx\aaa\a.txt ,这样就不能证明系统或者编程语言其实是支持混乱的分隔符的了
    raptor
        40
    raptor  
       2018-10-28 16:00:52 +08:00
    还是那句话,珍爱生命,远离微软
    ps1aniuge
        41
    ps1aniuge  
       2018-10-28 20:33:02 +08:00
    楼主开发 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  
       2018-10-29 10:14:09 +08:00
    python 中有 os.sep
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:37 · PVG 12:37 · LAX 20:37 · JFK 23:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.