2013-07-08 91 views
1

如何从文件路径获取文件名,可以从不同的OSX或Windows上载文件。
什么想实现什么是挑战如下:无法从文件路径获取文件名

  • 我的目标是清理的文件名,如果有任何非法字符。 示例:OSX允许\以及windows文件系统不允许的其他几个字符。 alg用_代替\
  • 有时某些浏览器(IE)将整个路径作为文件名发送到我的代码。所以,如果我从网络中的窗户上传共享文件,IE发送名称为\\\\servername\\folder\\filenmae.txt

- 我无法的FileInfo或路径中使用,因为文件名从OSX未来能有非法字符,如|><,因为如果Mac OSX中文件名的名称是\\path\ex\file,fileinfo或路径会给我“文件”作为文件名而不是整个名称。

- 现在,如果文件名有:\路径,我可以很容易地提取使用 filename.Substring(filename.LastIndexOf(@"\") + 1)
文件名 - 但我的问题是共享文件,因为共享的文件完整路径模式在Windows可以是OSX中的文件名。

我怎样才能得到全名?
任何建议,将不胜感激。

+3

您无法知道'\\ a \ b \ c.txt'是否是Windows的完整路径或来自* nix的异常文件名。 – SLaks

+0

在OSX中应用于文件名的规则是什么? –

+0

谷歌请!,我知道:-) – din

回答

0

感谢所有的回复,特别感谢@Dour High Arch。最终找出解决方案。使用fileInfo类,也可以使用Path来完成,但尚未经过测试。

try 
{ 
    FileInfo fileInformation = new FileInfo(tempFileName); 
    String directory = fileInformation.DirectoryName; 
    if (tempFileName.StartsWith(directory)) 
    { 
    filename = fileInformation.Name; 
    } 
} 
catch (Exception arugmentException) 
{ 
    if (!((arugmentException is ArgumentException) || 
    (arugmentException is NotSupportedException))) throw; 
} 
1

正如其他人所指出的;这是行不通的。您无法创建适用于所有操作系统的文件名,甚至无法创建可在单个操作系统中的所有文件系统上运行的文件名。我遇到了这个问题,试图将NTFS文件从Windows复制到ISO 9660驱动器。

不要试图“清理”文件名;规则太不可靠,并且跨文件系统冲突。使用您的操作系统的API来构建文件,如System.IO.Path.GetTempFileNameSystem.Windows.Controls.OpenFileDialog。如果您尝试以编程方式构造文件名,请将您认为可以在所有客户端文件系统上运行的名称(例如“MyFile”加上递增顺序号或十六进制GUID)传递给API,并在文件系统异常工作。

如果您要跨文件系统复制文件,最好将原始文件名存储为向用户显示,并将其用作“文件保存”对话框等的默认文件名,但不要再写依靠它们的程序。

+0

我明白,但是,如果有人从OS X上以文件名文本<>/\ txt上传文件,而另一个人试图在Windows上下载,会怎么样。 (忽略我如何将它存储在服务器上) – din

+0

在用户界面中显示该用户名为“text <>/\ txt”。如果你试图在Windows上保存它,它会抛出,并且你将不得不让用户再试一次或者创建你自己的名字。但是,这可能会发生在用户的任何文件名中;名称是否来自不同的文件系统并不重要。 –

+0

好主意,但我的任务是重命名这些文件。截至目前临时解决方案 - 尝试{filename = path.getFileName(fileName)} catch(Exception e){if(!(e是ArgumentException))throw;} filename = renameFileName(fileName); – din