在File
课堂上有两个字符串,separator
和pathSeparator
.
有什么不同?我什么时候应该使用另一个?
我在Windows上运行R,并在桌面上有一个csv文件.我加载如下,
x<-read.csv("C:\Users\surfcat\Desktop\2006_dissimilarity.csv",header=TRUE)
Run Code Online (Sandbox Code Playgroud)
但R给出以下错误消息
错误:'\ U'在没有以十六进制数字开头的字符串中使用"C:\ U"
那么加载这个文件的正确方法是什么.我正在使用Vista
tl; dr:我如何询问Windows系统上当前的目录分隔符是什么?
不同版本的Windows似乎表现不同(例如\
,/
两者都在英文版本上工作,¥显然是在日文版本上,₩显然是在韩文版本上等...
有没有办法避免硬编码,而是在运行时询问Windows?
理想情况下,解决方案应该不依赖于高层次的DLL一样ShlWAPI.dll
,因为下级库也取决于此.所以它应该要么依赖于kernel32.dll
或ntdll.dll
或等等......虽然我有一个很难找到任何东西可言,无论是在高位还是处于较低的水平.
一些小实验告诉我,它是Win32子系统(即kernel32.dll
......或者它可能RtlDosPathNameToNtPathName_U
在ntdll.dll
?不确定,没有测试...),它将正斜杠转换为反斜杠,而不是内核.(前缀\\?\
使得以后在路径中无法使用正斜杠 - 而NT本机用户模式API也会因正斜杠而失败.)
所以显然它不是"内置于"Windows,而只是一个兼容性功能 - 这意味着你不能盲目地用斜线代替反斜杠,因为任何随机前缀\\?\
到路径的程序都会自动在正斜杠上打破.
我对这个问题的结论有不同的感受,但我只是想我会提到它.
(我将其标记为"路径分隔符",即使这在技术上是不正确的,因为路径分隔符用于分隔路径,而不是目录(;
vs. \
).希望人们得到我的意思.)
ZIP条目存储条目的完整路径名,因为(我确定下一部分)ZIP存档未组织为目录.元数据包含有关如何存储文件的信息(内部目录).
如果我在Windows中创建ZIP文件,当我在另一个操作系统(例如Mac OS X)中解压缩数据时,文件结构将保持与以前一样在Windows中.这是因为unzipper是为处理这个而设计的,还是因为ZIP中的文件分隔符是标准的?
我问这个是因为我试图使用压缩文件的名称在ZIP文件中找到一个条目.但是我应该使用哪个文件分隔符使其在Windows以外的系统中运行?
我使用Java和方法:.getName()
的ZipEntry
让我使用Windows文件分隔符的路径\
.如果我使用java File.separator
分隔符使其在另一个操作系统上工作,这是否足够?或者我是否必须尝试使用每个可能的分隔符找到我的文件?
就在我以为我已经看到了Windows路径问题时,我现在遇到的情况只有在使用'/'(正斜杠)作为路径分隔符时才会失败:
C:\temp\tcbugs>mkdir "dir1 with spaces"
C:\temp\tcbugs>echo hi > "dir1 with spaces"\foo.txt
C:\temp\tcbugs>type "dir1 with spaces\foo.txt"
hi
C:\temp\tcbugs>type "dir1 with spaces/foo.txt"
The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)
特别有趣的是它似乎是特定于cmd.exe shell而不是在PowerShell中出现(也不是在win32 API中):
PS C:\temp\tcbugs> type 'dir1 with spaces/foo.txt'
hi
Run Code Online (Sandbox Code Playgroud)
另一个兴趣点是使用'cd'更改目录并使用'/'作为cmd.exe的路径分隔符确实有效:
C:\temp\tcbugs>mkdir dir2_no_spaces
C:\temp\tcbugs>cd ./dir2_no_spaces
C:\temp\tcbugs\dir2_no_spaces>cd ..
Run Code Online (Sandbox Code Playgroud)
然而,我无法在网上或MSDN的常用文档中找到任何对此特定问题的引用:
这引出了我的问题:为什么会发生这种情况,是否有一个明确的来源记录了这个怪癖?
更新:
dbenham指出,无论空格是否在目录名称中,问题都存在,因此在标题和问题正文中删除了对它的引用.还添加了一个有效的"cd ./"示例,而其他命令则没有.
出于好奇 - 有没有另一种方法来获取平台的路径分隔符char而不是os.path.normcase('/')
Python 2.4?
我期待像一个os.path.separator
常数......
File具有静态字符串分隔符和pathSeparator.分隔符是"默认名称分隔符",pathSeparator是"路径分隔符".
有什么不同?是否有一个人比另一个更好?
我需要一个类似于.NET的方法来安全地组合路径部分,而不必担心路径分隔符的平台细节.
在QT4中有这样的类和方法吗?
就像是:
QPath::Combine
Run Code Online (Sandbox Code Playgroud) 我正在Windows上开发Scala应用程序,我需要将文件的路径插入到HTML模板中.我使用Java io
并nio
使用文件和路径.
/* The paths actually come from the environment. */
val includesPath = Paths.get("foo\\inc")
val destinationPath = Paths.get("bar\\dest")
/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */
val relativeIncludesPath = destinationPath.relativize(includesPath)
Run Code Online (Sandbox Code Playgroud)
问题是输出relativeIncludesPath.toString
包含反斜杠\
作为分隔符 - 因为应用程序在Windows上运行 - 但由于路径要插入到HTML模板中,因此它必须包含正斜杠/
.
由于我file/path.toStringUsingSeparator('/')
在文档中找不到任何类似的东西,我现在正在帮助自己relativeIncludesPath.toString.replace('\\', '/')
,我觉得这很有吸引力.
问题:有没有比使用替换更好的方法?
我也尝试与Java的URI
,但它relativize
是不完整的.
我正在尝试识别文件夹中具有特定名称的所有文件。我正在使用标准代码来执行此操作,如下所示:
for paths, subdirs, files in os.walk(start_dir, topdown=True):
for file in files:
print(os.path.join(paths, file))
Run Code Online (Sandbox Code Playgroud)
我的问题是关于 Windows 机器中这段代码的输出,基本上路径的动态部分有错误的斜杠符号:
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\AesSheetNumberEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedDetailEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentReceivedEntity.java
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim\aes\DocumentTypeEntity.java
Run Code Online (Sandbox Code Playgroud)
给出的开始文件夹是:
D:/JAJA/Projects/DAF/AIM/WEBAPP/trunk/src/main/java/ie/gov/agriculture/aim
Run Code Online (Sandbox Code Playgroud)
文件夹分隔符是 unix one:"/"
而 os.walk 函数找到的所有后续子文件夹都带有 Windows 斜杠:"\"
所以最后我有无效的路径,不能立即使用。这是 python os 库中的错误还是实际上的错误?
目前我可以轻松地用正确的分隔符替换错误的分隔符,但我想知道这是否是唯一的方法?