我正在编写一个必须在用户PC中保存.txt文件的应用程序。我目前正在使用此代码:
Dim filepath As String = "G:\Username.txt"
If Not System.IO.File.Exists(filepath) Then
System.IO.File.Create(filepath)
End If
并将此代码用于其他本地驱动器F:\
和E:\
以及D:\
。像这个例子
Dim filepath2 As String = "D:\Username.txt"
If Not System.IO.File.Exists(filepath2) Then
System.IO.File.Create(filepath2)
End If
Dim filepath4 As String = "F:\Username.txt"
If Not System.IO.File.Exists(filepath4) Then
System.IO.File.Create(filepath4)
End If
此代码正常运行,但我遇到问题如果用户PC只有2个本地驱动器,驱动器C:\
除外,例如G:\
和D:\
。当试图将.txt文件保存到驱动器F:\
的代码无法使用System.IO.DirectoryNotFoundException
执行时。我希望以某种方式跳过代码,如果驱动器不可用,并且仅在本地驱动器(例如F:\
)可用时执行代码。
答案 0 :(得分:1)
正如您对问题的评论中所述,您的代码可能是在指定的驱动器上创建文件,但是它会在文件上打开句柄。当垃圾收集出现时,文件上的打开句柄将被删除。但是,如果您在应用程序打开它们时尝试修改这些文件,您会发现该文件已被锁定。您正在使用的方法IO.File.Create
返回FileStream
个对象。这个对象支持IDisposable,因此你应该自己清理,或者实现Using
指令。
其次,正如另一个答案所指出的,检查文件是否存在的逻辑是有缺陷的,如果驱动器本身不存在,那么你会得到误报,而不仅仅是文件。在不同的思考路径上,使用File.Exists()
几乎从来没有用,因为它在运行时不会实时给出准确的结果。文件的存在总是有可能从调用File.Exists()
到应用程序尝试访问文件的时间发生变化;俗称竞争条件。相反,你应该尝试做你正在做的事情,然后处理正在发生的任何类型的例外。
Option Strict On
Option Explicit On
Imports System.IO
Module Module1
Sub Main()
Dim fleName As String = "Username.txt"
For Each drvInfo As DriveInfo In DriveInfo.GetDrives
If drvInfo.DriveType = DriveType.Fixed AndAlso drvInfo.Name <> "C:\" Then
Try
Dim fleStream As FileStream = File.Open(drvInfo.Name & fleName, FileMode.Create, FileAccess.Write)
' Do some stuff here
fleStream.Close()
fleStream.Dispose()
' Or implement the 'Using' directive
Using fleStream As FileStream = File.Open(drvInfo.Name & fleName, FileMode.Create, FileAccess.Write)
'do some stuff here
End Using
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
Next
End Sub
End Module
答案 1 :(得分:0)
由此:
If Not System.IO.File.Exists(filepath2) Then
看起来你在说(伪代码):
IF 'path including drive' does NOT exist, THEN create file
如果你仔细阅读,仔细考虑,你会注意到:
如果驱动器不存在,则将其归类为不存在的路径。因此,它会尝试在那里创建一个文件,但显然会失败。