ioutil.ReadDir+os.Rename组合带来的问题

new_golang · 2019-07-08 10:35:46 · 1360 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-07-08 10:35:46 的主题,其中的信息可能已经有所发展或是发生改变。

files, _ := ioutil.ReadDir(path)->循环打印files没有问题 os.Rename(old,new)->单独执行也正常修改了文件名(os.Rename好像是复制操作) 然后对files执行range批量修改名称时出现了问题.大概只循环了3-4次就退出了.并且没有报错.goland提示Process finished with exit code 0表示正常退出.起初怀疑是复制没完成导致主线程提前退出.最末尾追加了 time.Sleep(time.Hour*1).依然提示Process finished with exit code 0正常退出!!休眠竟然被忽略了,请经历过的人指教下问题出现在哪?? 大致代码如下

files, _ := ioutil.ReadDir(path)

for i := 0; i < len(files); i++ {

fmt.Println(files[i].Name())

split := strings.Split(files[i].Name(), ".")

os.Rename(path+"/"+files[i].Name(), "D:/rename/"+strconv.Itoa(i)+"."+split[1])

}

在stackoverflow找到同样的问题:https://stackoverflow.com/questions/56075774/golang-os-renamefromdir-todir-not-working-in-windows# 但是没 解决方案....


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1360 次点击  
加入收藏 微博
7 回复  |  直到 2019-08-20 10:02:17
eurake
eurake · #1 · 6年之前

检查程序的运行权限问题

new_golang
new_golang · #2 · 6年之前
eurakeeurake #1 回复

检查程序的运行权限问题

没有,因为单独执行这个语句是成功的.并且循环了3-4次的执行结果也是成功的,就是没完成之后的循环就退出了程序.

new_golang
new_golang · #3 · 6年之前
eurakeeurake #1 回复

检查程序的运行权限问题

循环的length也确认过是正确的.与目录文件数结果一致.循环打印文件名称是能够全部且完整的输出.

hacker_cgh
hacker_cgh · #4 · 6年之前

建议你把rename返回的错误信息打印出来,也许能发现问题

new_golang
new_golang · #5 · 6年之前
hacker_cghhacker_cgh #4 回复

建议你把rename返回的错误信息打印出来,也许能发现问题

没有错误信息...如果有的话就不会问这个问题了.看stackoverflow上的描述.

jan-bar
jan-bar · #6 · 6年之前
虽然在我的电脑上试了上述程序没问题,大概因为我没有用C盘吧。
不过我还是怀疑files, err := ioutil.ReadDir(source)占用着文件导致rename失败,因为源文件被占用了啊
所以我猜你用下面的方法得到文件名列表就行,因为在下面函数的files是局部变量,返回后就释放占用
你可以试试,我也只是猜测而已。

func readFiles(source string) ([]string, error) {
    files, err := ioutil.ReadDir(source)
    if err != nil {
        return nil, err
    }
    fName := make([]string, 0, len(files))
    for _, f := range files {
        fName = append(fName, f.Name())
    }
    return fName, nil
}
new_golang
new_golang · #7 · 6年之前
jan-barjan-bar #6 回复

```go 虽然在我的电脑上试了上述程序没问题,大概因为我没有用C盘吧。 不过我还是怀疑files, err := ioutil.ReadDir(source)占用着文件导致rename失败,因为源文件被占用了啊 所以我猜你用下面的方法得到文件名列表就行,因为在下面函数的files是局部变量,返回后就释放占用 你可以试试,我也只是猜测而已。 func readFiles(source string) ([]string, error) { files, err := ioutil.ReadDir(source) if err != nil { return nil, err } fName := make([]string, 0, len(files)) for _, f := range files { fName = append(fName, f.Name()) } return fName, nil } ```

获取文件名列表是正确的(fmt.Println(files[i].Name())能输出全部文件名).前几项修改也是正确的.然后循环下去就不行了.理论上来说是一个一个文件执行下去的.不会存在加载两次被占用的情况.最最恐怖的是实际上算是异常退出,提示确是exit code 0.连排错的基础都没办法.就是没有一个panic都不知道怎么去找错 :frowning:

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传