无法从文件路径获取文件名

时间:2013-07-08 17:02:43

标签: c# .net

如何从文件路径获取文件名,文件可以从不同的OSX或windows上传 我想要实现的目标和挑战如下:

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

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

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

我如何获得全名? 任何建议将不胜感激。

3 个答案:

答案 0 :(得分:2)

我认为你想使用Path的静态方法:

Path.GetFileName(string);Path.GetDirectoryName(string);

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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;
}