提问人:user22716518 提问时间:10/10/2023 最后编辑:Andrew Mortonuser22716518 更新时间:10/10/2023 访问量:63
File.WriteAllText 引发异常“找不到文件”
File.WriteAllText throws exception "Could not find file"
问:
Visual Studio 2012
VB.NET Windows 窗体应用程序
.NET Framework 4.5.2
VB终于赢了。我没有想法。
File.WriteAllText 函数抛出异常“找不到文件”,即使 MS 说它只能抛出以下异常(MS 文档):
' 例外情况: ' T:系统。ArgumentException: ' path 是一个长度为零的字符串,仅包含空格,或者 >包含一个或多个 ' 由 >System.IO.Path.InvalidPathChars 定义的无效字符。 ' ' T:系统。ArgumentNullException: ' 路径为 null 或 contents 为空。 ' ' T:System.IO.PathTooLongException: ' 指定的路径和/或文件名都超出了系统> 定义的最大长度。 例如,在基于 Windows 的平台上,路径必须不太> 超过 248 个字符, “,文件名必须少于 260 个字符。 ' ' T:System.IO.DirectoryNotFoundException: ' 指定的路径无效(例如,它位于未映射的驱动器上)。 ' ' T:System.IO.IOException: ' 打开文件时发生 I/O 错误。 ' ' T:系统。未经授权的访问异常: ' path 指定了只读文件。-or- 不支持此操作 ' 在当前平台上。-or- 路径指定了一个目录。-or- 调用方执行 “没有所需的权限。 ' ' T:系统。NotSupportedException: ' 路径的格式无效。 ' ' T:System.Security。安全异常: ' 调用方没有所需的权限。
代码(上周有效):
Dim filepath As String = StringFilePath + "\" + DateTime.Now.ToString("yyyy/MM")
Dim stringFile As String = ""
If My.Computer.FileSystem.DirectoryExists(filepath) = False Then
My.Computer.FileSystem.CreateDirectory(filepath)
End If
stringFile = StringHTMLHeader + StringTestDoc + StringHTMLFooter
StringLastSavedFile = Path.Combine(filepath, "Test Result " + DateTime.Now.ToString("dd-HH-mm-ss") + ".htm")
Try
File.WriteAllText(StringLastSavedFile, stringFile)
Catch ex As Exception
End Try
- 检查文件路径等。
- 以管理员身份运行
- 当然,还有重启。
答:
我尝试了以下代码,它起作用了。我不得不根据各种评论猜测一些变量。
Dim StringLastSavedFile As String = ""
Dim StringFilePath As String = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Tester")
Dim filepath As String = IO.Path.Combine(StringFilePath, DateTime.Now.ToString("yyyy-MM"))
Dim stringFile As String = ""
If Not IO.Directory.Exists(filepath) Then
IO.Directory.CreateDirectory(filepath)
End If
stringFile = "TEST DATA" '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
StringLastSavedFile = IO.Path.Combine(filepath, "Test Result " & DateTime.Now.ToString("dd-HH-mm-ss") & ".htm")
Try
IO.File.WriteAllText(StringLastSavedFile, stringFile)
Catch ex As Exception
Stop
End Try
此代码是不必要的:
If My.Computer.FileSystem.DirectoryExists(filepath) = False Then
在 CreateDirectory()
方法的文档中请注意这一点:
如果该目录已存在,则不会引发异常。
由于磁盘 I/O 可能是在单台计算机中可以执行的最慢操作,因此值得删除这种浪费的检查,以便始终调用,而不要首先进行条件检查。CreateDirectory()
If
将文件 I/O 包装在只吞下异常的 Try/Catch 中也是一个坏主意。您可能确实想要尝试/捕获,但如果是这样,请将其放在更高的级别,或者至少对异常做出反应。
此外,文件夹路径中的字符在 Windows 上无效,并将在 unix 系统上创建另一个目录级别。我们也看不到变量来知道是否还有其他无效字符。/
StringFilePath
最后,至少自 2004 年以来,向变量名称添加类型信息就不被认为是一种好做法。停止将“String”或类似内容作为变量名称的一部分(但在声明变量时仍要提供类型),并尝试声明变量具有较短的作用域(即:在使用它们的位置附近声明它们),以便可以有效地收集它们。
像这样把它们放在一起:
Dim filepath As String = IO.Path.Combine(StringFilePath, DateTime.Now.ToString("yyyy-MM"))
My.Computer.FileSystem.CreateDirectory(filepath)
Dim fileData As String = HTMLHeader & TestDoc & HTMLFooter
Dim fullFileName = Path.Combine(filepath, "Test Result " + DateTime.Now.ToString("dd-HH-mm-ss") & ".htm")
File.WriteAllText(fullFileName, fileData)
哦,还有一件事。请特别注意以下例外情况:
System.Security.SecurityException:调用方没有所需的权限。
您需要更全面地调查。
评论
"Test Result " + DateTime.Now.ToString("ddHHmmss")+ ".htm"
给了我一个结果。我不知道你的连字符是从哪里来的。Test Result 10125731.htm