【问题标题】:Path.GetRandomFileName vs Path.GetTempFileNamePath.GetRandomFileName 与 Path.GetTempFileName
【发布时间】:2017-03-31 03:50:53
【问题描述】:

基于https://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename(v=vs.110).aspx的推荐 我已将 GetTempFileName 替换为 GetRandomFileName 以获取临时文件的名称。它会导致问题。有时 GetRandomFileName 返回的不是文件名,而是 System32 文件夹中的位置。当然,没有管理员权限的用户会遇到找不到文件的错误。 我错过了什么吗?

这是一个代码:

string tempFileName = Path.GetRandomFileName(); FileStream tempFileStream = null; tempFileStream = File.Open(tempFileName, FileMode.Create, FileAccess.ReadWrite);

稍后当我尝试通过代码访问该文件时:

FileInfo fileInfo = new FileInfo(tempFileName);

我有一个错误:

System.UnauthorizedAccessException:对路径“C:\Windows\system32\25ddubwt.qsc”的访问被拒绝。

我意识到,当用户使用 Windows/开始按钮中的菜单启动程序时,应用程序的当前目录将是 System32

【问题讨论】:

  • 返回位置而不是文件名的任何示例?
  • 这是一个 C# Fiddle 演示 Alex K 所说的内容。请注意,它只打印一个随机文件名:dotnetfiddle.net/dqKbUy 此外,GetRandomFileName() 不会创建文件,而 GetTempFileName 创建一个零字节文件并返回它的完整路径。
  • 我必须编辑我的问题。如果您使用 Windows 开始按钮菜单上的 sortcut 启动 exe,则当前目录变为 System32。

标签: c#


【解决方案1】:

GetTempFileName() 返回完整路径,GetRandomFileName() 不返回。

如果你假设GetRandomFileName() 有一个路径并写入它,那么如果那是当前目录,文件很可能会在 System32 中结束。

修复创建完整路径:

string fname = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

【讨论】:

  • 这将是一个合理的解释。但它不是当前目录。而且只有 10-25% 的时间会发生这种情况。
  • 一个会指向 c:\something\temp\ 另一个不会,这是唯一的区别,而且差别很大。其他东西可能会改变目录 - 这就是为什么你应该尽可能指定绝对路径。
  • 这是否意味着有时当前目录可以是System32,有时不是?取决于什么?
  • 最好不要假设当前目录的位置,因为当前目录可能会发生变化的原因有很多,例如SO question中讨论的 OpenFileDialog
  • 明确提及GetRandomFileName() 不会在磁盘上创建文件,而GetTempFileName() 会这样做是个好主意。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2017-06-29
  • 2012-03-01
  • 2014-03-08
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多