我想创建一个名为“out”而不是“out.zip”的zip文件。当我运行这一行时:
zip("out", zippedfiles)
其中zippedfiles
是文件列表,我得到out.zip
。我在Windows环境中这样做。
感谢。
答案 0 :(得分:7)
有些人提到这是拉链的行为,但不是为什么这就是你所看到的原因。如果您查看zip()
的来源或甚至帮助?zip
,应该立即明确您所看到的行为来自系统zip
功能而与R本身无关。所有R都调用系统函数进行压缩,默认情况下为zip
:
R> zip
function (zipfile, files, flags = "-r9X", extras = "", zip = Sys.getenv("R_ZIPCMD",
"zip"))
{
if (missing(flags) && (!is.character(files) || !length(files)))
stop("'files' must a character vector specifying one or more filepaths")
args <- c(flags, shQuote(path.expand(zipfile)), shQuote(files),
extras)
invisible(system2(zip, args, invisible = TRUE)) ## simply calling system command
}
<bytecode: 0x27faf30>
<environment: namespace:utils>
如果您对扩展程序感到恼火,请在致电file.rename()
后发出zip()
来电:
file.rename("out.zip", "out")
答案 1 :(得分:2)
对我来说,如果我将.
(即句点)附加到文件名,则不会使用扩展名,例如out.
应该有效。完整的表达方式:zip("out.", zippedfiles)
。
对于它的价值,这是由于zip的默认行为,并不是R或Windows的问题。
更新1:通常,最好避免使用特定于操作系统的方法。我认为如果代码在其他平台上运行,这种方法可能会产生问题。 Gavin的回答涉及重命名,更具可移植性。更重要的是,正如我在评论中所建议的那样,在重命名之前使用file.exists()
测试目标是否存在,增加了另一层安全性。通过tempfile()
获取临时文件名可获得额外的安全层。写入或重命名时避免名称冲突的另一种方法是在名称中使用时间戳。