通过简单的替换将Windows文件路径转换为Unix文件路径是否安全?


12

因此,例如说我拥有它,这样我的所有文件都将从Windows机器转移到Unix机器,例如:C:\test\myFile.txtto {somewhere}/test/myFile.txt(此时驱动器号无关)。

当前,我们自己编写的实用程序库提供了一种方法,可以用正斜杠简单地替换所有反斜杠:

public String normalizePath(String path) {
   return path.replaceAll("\\", "/");
}

斜杠是保留的,不能成为文件名的一部分,因此应保留目录结构。但是,我不确定Windows和Unix路径之间是否还有其他可能需要担心的麻烦(例如:非ASCII名称等)


4
只需注意空格-在Windows文件夹名称中放置空格比在UNIX目录名称中更常见。特别是,“ \ Program Files”总是让我受益。根据您使用路径的方式,您可能必须使用“ \”对空格进行转义。
罗布2014年

1
@delnan为简单起见,让我们限制路径范围以排除变量路径。
MxLDevs 2014年

2
@MxyL当您对路径进行硬编码而不是使用环境变量时,问题不会消失。如果您只想要一条不会破裂的路径,那应该没问题。如果您想要一条有意义的路径,或者要与其他软件(或用户期望...)进行交互,则需要按路径进行判断。

1
@delnan我主要专注于产生有效路径,但这是一个好点。我要转换的路径应该足够简单,以至于它们本身是有意义的。
MxLDevs

3
在Linux上的文件名中允许使用反斜杠,因此在Linux路径中替换反斜杠可能会添加无效目录。例如,/foo\\bar不等同/foo/bar于Linux。

Answers:


7

是的, 如果您仅在Windows上进行替换并且在其他系统上运行时将其关闭。

在类Unix系统上进行替换是错误的,因为在类Unix平台上文件或目录名称中\有效字符。在这些平台上,文件名和目录名仅NUL/被禁止。

另外,某些Windows API函数(大多数是较低级别的函数)不允许使用正斜杠- 必须将反斜杠与它们一起使用。


4

是的,但这整件事是有争议的。Java在Windows上将正斜杠无缝转换为反斜杠。您可以对所有硬编码或存储在配置中的路径简单地使用正斜杠,并且这两个平台都可以使用。

就个人而言,即使在Windows上,我也总是使用正斜杠,因为它不是转义符。无论原始路径是在代码中还是在属性文件中外部化,我都以相同的方式对其进行编码。

尝试一下!这将在Windows中运行。显然,将实际路径更改为已存在的内容,并且您的用户有权阅读。

File f = new File("c:/some/path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong!");
}

奖励:您甚至可以在同一路径中混合使用斜杠

File f = new File("c:/some\\path/file.txt");
if (!f.canRead()) {
  System.out.println("Uh oh, Snowman was wrong again!");
}

1
如果您阅读了我的全部答案,那么您会看到我在哪里说始终使用Unix文件分隔符在两个地方都能正常工作,而无需进行转换。

该问题指出将传输文件,并保留文件的存储方式。我在问题上添加了评论,要求对此进行澄清。根据回复,我将适当地编辑答案。

该程序实际上不可能在其中包含手动输入的所有要传输文件的列表。使用某种自动机制枚举文件的可能性更大。给定问题中指出的问题参数,此机制将提供传统的Windows样式路径。在其目前的形式,这个答案告诉了OP,而不是解决不同的问题,而不告诉他们如何,甚至认为他们应该改变他们到不同的问题。
伊利亚·卡根

请阅读我以前的评论。

1
Windows既可以识别正斜线也可以识别反斜线,并且自从早期的MS-DOS以来就一直采用这种方式。即每个Microsoft OS内核都具有正斜杠分隔符支持。早期的COMMAND.COM解释器具有运行时首选项:您可以配置解释器用于打印和解析的斜杠。
哈兹

3

Windows上的另一个复杂之处在于,它还支持UNC表示法以及传统的驱动器号。

可以通过访问远程文件服务器上的文件\\server\sharename\path\filename


1
我认为这是到目前为止所引用的唯一对此应用程序确实存在的问题。如果涉及UNC路径,则无法将它们有效地转换为Unix样式的路径。
Jules

2

不。 除了路径分隔符(“ \ vs /”东西)以外,还有更多需要考虑的事情。正如Rob Y所提到的,在Windows中存在如何处理空间以及它们频繁出现的问题。两种环境中有不同的非法字符。Unix愿意在被前导“ \”转义时允许几乎所有内容。Windows使用'“'来处理嵌入式空间。Windows使用UCS-16,而Unix使用ASCII或UTF-8。

等。

但是,对于许多可以在它们需要操作的路径名上施加约束的应用程序,您实际上可以按照建议的方式进行操作。它将在至少很多情况下起作用,但不是全部。


1
我认为这些担忧对于所提出的问题是不正确的。空间处理是一个用户界面问题。Unix系统可以像Windows一样处理文件名中的空格。Windows非法字符是Unix非法字符的超集。Windows文件名中不能有任何反斜杠(将转换的目录分隔符除外)。对嵌入式空间使用引号是用户界面级别的关注点,而不是文件处理问题。转换代码显然是用Java编写的,因此应自动处理UCS16-> UTF8转换。
Jules

-1

从MS-DOS开始的每个Microsoft操作系统,都已在内核级别理解了正斜杠和反斜杠

因此,在Windows上,您可以在它们之间自由转换。两者都具有与保留分隔符相同的状态。在任何有效路径中,就内核而言,您都可以用斜杠替换反斜杠,反之亦然,而无需更改其含义。

在早期版本的DOS中,Microsoft的command.com解释器使它成为可配置的首选项,使用斜杠来显示和解析路径。最终被删除。

Windows中的某些用户空间程序(例如Windows Shell(explorer.exe))不喜欢正斜杠。那只是那些程序中的伪劣程序。


1
尽管这是事实,但我认为这对OP的问题(AIUI)涉及转换现有路径名(在该路径名中已经包含反斜杠)没有帮助。它用于编写跨平台的代码实现,你可以只使用斜线,让他们在大多数情况下工作是非常有用的,但在这种情况下,我不认为它帮助。
Jules

@Jules OP正在从Windows传输文件。此答案说明没有反斜杠要替换。它们根本不在Windows文件系统中。所有路径都可以用正斜杠表示(Windows甚至可以理解)。
哈兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.