C# 如何获取最终文件名
我在获取c#中的最终文件名时遇到问题 例如: 如果用户键入两个文件名: “asd.”和“asd…” 或 “asd”和“asd”(两个空格) 然后,方法C# 如何获取最终文件名,c#,file-io,C#,File Io,我在获取c#中的最终文件名时遇到问题 例如: 如果用户键入两个文件名: “asd.”和“asd…” 或 “asd”和“asd”(两个空格) 然后,方法Path.GetFileName返回“asd.”、“asd…”、“asd”、“asd”(两个空格) 将其保存在硬盘上(例如使用StreamWriter)后,只有一个文件“asd” 如何检查输入文件的最终名称?我想还有很多其他的例子,我永远也无法用手工来正确地完成 编辑: 我使用它来比较两个文件名和GetFileName返回值: 对于a.txt-a.
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作为你的问题的正确答案,他真的把它搞好了,没有想到它的好解决方案,尤其是没有反射的那个!