【问题标题】:Lua - Delete non-empty directoryLua - 删除非空目录
【发布时间】:2016-10-16 13:49:49
【问题描述】:

我正在尝试删除 Lua 中的非空目录,但没有成功,

我尝试了以下方法:

os.remove(path_to_dir)

得到了错误:Directory not empty 39path_to_dir中的文件数为39时

也试过了:

require ('lfs')
lfs.rmdir(path_to_dir)

并得到错误:目录不是空的'

值得一提的是,我做了chmod -R a+rX *path_to_dir

感谢您的帮助。

【问题讨论】:

  • os.execute('rm -rd "'..path_to_dir..'"') 在 Linux 上
  • os.execute('rd /s/q "'..path_to_dir..'"') 在 Windows 上

标签: lua lua-table torch


【解决方案1】:

您可以按照@EgorSkriptunoff 的建议并使用特定于操作系统的命令来删除非空目录,或者使用lfs 获取文件/子目录列表(例如described in this SO answer)并逐个删除它们一个使用os.remove

【讨论】:

  • 很难相信 Lua 没有提供删除非空目录的功能。
  • Lua 没有提供的原因是 C 也没有以标准的跨平台方式提供。如果你想要一个功能齐全的文件系统 api,你需要使用 lua 的附加组件之一,比如 luafilesystem 或其他提到的。
  • 这是有道理的,实际上只是因为 Lua 没有提供这样的功能。问题是,他不能只使用像 luafilesystem 这样的附加模块。我认为他(并且知道我)会愿意这样做。但即使使用 lfs,仍然 必须实现一个自己的函数来处理像删除目录这样简单的事情。这有点可悲。
  • @ChrisK。 Lua 社区的理念是整个环境应该是跨平台和可嵌入的。如果您不同意这一点,请随时将您自己的文件系统 api 发布到 luarocks,但我个人宁愿编写十行代码,也不愿试图证明在我的系统上嵌入数兆字节的库是合理的。如果我想这样做,我会切换到 NodeJS 和 npm install 一半的互联网到我的机器上。
【解决方案2】:

使用path 库,您可以做到

function rmdir(p)
  path.each(path.join(p,"*"), function(P)
    path.remove(P)
  end,{
    param = "f";   -- request full path
    delay = true;   -- use snapshot of directory
    recurse = true; -- include subdirs
    reverse = true; -- subdirs at first 
  })
  path.remove(p)
end

【讨论】:

    【解决方案3】:

    根据您的操作系统,您可以这样做:

    os.execute("rm --recursive " .. path_to_directory)
    

    (此示例适用于 linux)

    【讨论】:

      【解决方案4】:

      使用 lua lfs,您可以实现一个递归函数来做到这一点。

      local lfs = require('lfs')
      
      local deletedir
      deletedir = function(dir)
          for file in lfs.dir(dir) do
              local file_path = dir..'/'..file
              if file ~= "." and file ~= ".." then
                  if lfs.attributes(file_path, 'mode') == 'file' then
                      os.remove(file_path)
                      print('remove file',file_path)
                  elseif lfs.attributes(file_path, 'mode') == 'directory' then
                      print('dir', file_path)
                      deletedir(file_path)
                  end
              end
          end
          lfs.rmdir(dir)
          print('remove dir',dir)
      end
      
      
      deletedir('tmp')
      

      【讨论】:

        猜你喜欢
        • 2013-08-05
        • 2012-05-31
        • 2010-12-11
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多