C# 如何获取最终文件名

C# 如何获取最终文件名,c#,file-io,C#,File Io,我在获取c#中的最终文件名时遇到问题 例如: 如果用户键入两个文件名: “asd.”和“asd…” 或 “asd”和“asd”(两个空格) 然后,方法Path.GetFileName返回“asd.”、“asd…”、“asd”、“asd”(两个空格) 将其保存在硬盘上(例如使用StreamWriter)后,只有一个文件“asd” 如何检查输入文件的最终名称?我想还有很多其他的例子,我永远也无法用手工来正确地完成 编辑: 我使用它来比较两个文件名和GetFileName返回值: 对于a.txt-a.

我在获取c#中的最终文件名时遇到问题

例如:

如果用户键入两个文件名:

“asd.”和“asd…”

“asd”和“asd”(两个空格)

然后,方法
Path.GetFileName
返回“asd.”、“asd…”、“asd”、“asd”(两个空格)

将其保存在硬盘上(例如使用StreamWriter)后,只有一个文件“asd”

如何检查输入文件的最终名称?我想还有很多其他的例子,我永远也无法用手工来正确地完成

编辑

我使用它来比较两个文件名和GetFileName返回值: 对于a.txt-a.txt 对于A.txt-A.txt


但保存后是同一个文件。比较必须忽略大小写。

在Windows 7下,我无法在测试之间重命名文件。(它恢复为test)因此我认为重命名来自于对文件强制执行特定规则的文件系统,而不是.Net

即使使用互操作调用,也无法创建带有尾随点的文件。我真的认为你不能从.Net内部得到正确的文件名。[编辑:事实上,乌卢格贝克的回答显示了一个很好的方法]

解决方案可能是将一个名为的空文件写入临时目录,并在删除它之前检查结果文件名


下面是一些详细信息:

在.Net的Path类中有一个有趣的内部NormalizePath方法。如果你不介意反射,你可以用它

string fileName = "asd..";
MethodInfo normalizePathMathod = typeof(Path).GetMethod("NormalizePath", BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(string), typeof(bool) }, null);
string normalizedFilePath = (string)normalizePathMathod.Invoke(null, new object[] { fileName, true });
string normalizedFileName = Path.GetFileName(normalizedFilePath);
只是找到了更好的解决方案,没有思考。GetFullPath调用NormalizePath方法。因此,我们可以将其更改为:

string fileName = "asd..";
string normalizedFilePath = Path.GetFullPath(fileName);
string normalizedFileName = Path.GetFileName(normalizedFilePath);

如果使用
FileStream
打开文件,则可以在打开流后使用
FileStream.Name
属性来获取“最终”文件名

一个粗略的例子:

SaveFileDialog sDlg = new SaveFileDialog();

if (sDlg.ShowDialog() == DialogResult.OK)
{
     // E.g., sDlg.FileName returns "myFile..."
     FileStream f = new FileStream(sDlg.FileName, FileMode.Create);
     Console.WriteLine(f.Name); // then f.Name will return "myFile"
     f.Close();
     Console.ReadLine();
}
sDlg.Dispose();

让我看看你的代码,这样我们就可以看到这一点并帮助你。我不认为投票结果是正确的。这是一个关于编程的合法问题,实际上不需要任何示例代码。问题很清楚:例如,当SaveFileDialog将文件名报告为“ads…”并保存时,操作系统会将该文件重命名为“ads”。你怎么能确定这已经发生了?一个有趣的问题。msdn的参考文献中没有(明显)记录这种行为。就NTFS(或FAT32?)而言,当然可以创建名称中带有尾随空格的文件,我只是在cygwin shell中完成了这项工作。但是当我试图添加一个空间(“源和目标是同一个文件”)时,浏览器似乎将文件名作为同一个文件处理,并拒绝重命名它。类似于不连贯的案例处理,它可以在Windows下困扰java开发者。Adam You应该真正把Ulugbek作为你的问题的正确答案,他真的把它搞好了,没有想到它的好解决方案,尤其是没有反射的那个!