我在使用c#获取最终文件名时遇到问题。
例如:
如果用户输入两个文件名:
“ASD”。和“asd ..”
或
“asd”和“asd”(两个空格)
然后方法Path.GetFileName
返回“asd。”,“asd ..”,“asd”,“asd”(两个空格)。
将其保存在硬盘驱动器上(例如使用StreamWriter)后,只有一个文件“asd”
如何查看输入文件的最终名称?我想还有很多其他的例子,我永远无法手动正确地做到这一点。
修改:
我用它来比较两个文件名和GetFileName返回: 对于a.txt - a.txt 对于A.txt - A.txt
但保存后它是同一个文件。比较必须忽略大小写。
答案 0 :(得分:4)
.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);
找到更好的解决方案,没有反思。 Path.GetFullPath调用NormalizePath方法。所以我们可以将其改为:
string fileName = "asd..";
string normalizedFilePath = Path.GetFullPath(fileName);
string normalizedFileName = Path.GetFileName(normalizedFilePath);
答案 1 :(得分:2)
如果使用FileStream
打开文件,则可以在打开流后使用FileStream.Name
属性来获取" final"文件名。
一个粗略的例子:
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();
答案 2 :(得分:0)
在Windows 7下,我无法将文件从test重命名为test。 (它恢复测试)所以我认为重命名来自文件系统,它强制执行文件的特定规则而不是.Net。
即使使用互操作调用,也无法创建带尾随点的文件。我真的不认为你可以从.Net内部获得更正的文件名。 [编辑:事实上,乌鲁别克的答案显示了一个非常好的方法]
解决方案可能是将带有名称的空文件写入临时目录,并在删除之前检查生成的文件名是什么。