【发布时间】:2017-05-01 01:38:33
【问题描述】:
我正在尝试根据不包含扩展名的路径删除文件或文件夹。
假设我有以下路径:
/home/tom/windows
windows 可以是名为 windows 的文件夹或名为 windows.txt 的文件
由于路径本身不包含扩展名(.txt),脚本需要猜测是应该删除文件夹(如果有)还是文件(如果有)。
初步方法:
fs.stat(path, (err, stats) ->
/* ---------- RUN IF PATH IS VALID ---------- */
// If we don't have any erros and the path is a directory,
// simply remove that directory and end here
if (!err && stats.isDirectory())
fs.rmdir(path, (err) ->
if (err) then return done(err)
return done(null, 1)
)
/* ---------- ---------- ---------- ---------- -- */
/* ---------- RUN IF PATH IS NOT VALID ---------- */
// If we have an error other than "ENOENT" (non-existend file)
// then return
if (err.code != 'ENOENT') then return done(err)
// Now we know that the path must be a file, thus verify
// its type and extension then unlink
fs.stat(path + '.txt', (err, stats) ->
if (err) then return done(err)
if (!stats.isFile()) then return done(err)
fs.unlink(path + '.txt', (err) ->
if (err) then return done(err)
done(null, 1)
)
)
说明:
通过 fs.stat 测试路径是否存在,然后检查它是否是目录。 如果它是一个目录,只需将其删除并结束执行。
如果上一步中的条件不匹配,则继续。 检查条件不匹配的原因(err.code)。 如果错误不是针对不存在的文件,则结束执行。
[其他]
继续,因为我们知道路径必须是文件,因为我们之前检查过它是否是目录。 附加扩展名 (.txt) 并确保该文件确实存在。 如果是这样,只需取消链接文件。
另一种方法:
我可以将扩展名直接附加到路径并使用 fs.unklink() 并测试名为 EISDIR 的错误代码。如果为 false,则路径必须是有效文件,因此将其删除。如果为真,删除目录
fs.unlink(path + '.txt', (err) ->
//Path is a valid file, thus remove
if (!err) then return done(null, 1)
//Path is not valid file, thus check if directory
if (err.code != 'ENOENT' && err.code != 'EISDIR')
return done(err)
//Path is directory so remove it
fs.rmdir(path, (err) ->
if (err) then return done(err)
done(null, 1)
)
)
结论?
是否有任何改进、解决方案或设计概念?
【问题讨论】:
-
你确定你没有想太多?
-
我知道这很复杂,但最后我也想在其他 FS 方法上使用这种方法。例如
rename()。问题是路径事先不包含扩展名。 -
一点都不复杂,所以才奇怪你为什么这么关心。
-
谢谢@DaveNewton 我很担心,因为我最初的方法很繁重。我认为第二种方法是要走的路。我不知道这是否可以进一步改进,
-
我个人更喜欢第一种方法。一点都不重,就是十几行代码……
标签: javascript node.js coffeescript fs