如何跳过不可用的驱动器号

时间:2015-04-29 12:33:36

标签: vb.net

我正在编写一个必须在用户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:\)可用时执行代码。

2 个答案:

答案 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

如果你仔细阅读,仔细考虑,你会注意到:

如果驱动器不存在,则将其归类为不存在的路径。因此,它会尝试在那里创建一个文件,但显然会失败。