如何检查文件 (.wav) 是否打开然后播放文件

How to check if file (.wav) is opened and then play file

我目前正在开发一个控制台应用程序来播放新创建的 WAV RIFF 文件,然后将其删除。就像我说的,它是新创建的,所以我需要确保文件在我开始播放之前没有被编辑,否则它会被破坏。播放后,我将其删除。

目前,我的代码如下所示(使用 System.IO):

Sub Main()

    Dim fileName As String
    fileName = "C:\temp\Burst\Burst.wav"

    While CheckFile(fileName)
    End While

    Try
        My.Computer.Audio.Play(fileName, AudioPlayMode.WaitToComplete)
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try

    My.Computer.FileSystem.DeleteFile(fileName)

End Sub

Private Function CheckFile(ByVal filename As String) As Boolean
    Try
        System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
        FileClose(1)
        Return False
    Catch ex As Exception
        Return True
    End Try
End Function

我用来检查文件是否打开的函数是由 sealz. I found it here 创建的。然而不幸的是,这个函数引发了一个异常,运行后,程序无法访问该文件,因为它正在被另一个进程使用。如果我去掉这个功能,文件可以打开,播放,删除。

异常内容如下:

类型为“System.IO.IOException”的未处理异常发生在 mscorlib.dll 附加信息:进程无法访问文件 'C:\temp\Burst\burst.wav',因为它正被另一个进程使用。

因此,本应帮助确定文件是否正在使用的函数实际上导致文件被打开。好像没关门无论如何我可以修改这个当前函数以适合我的应用程序或者是否有任何其他关于如何解决这个问题的想法。谢谢你的时间。

-乔希

这是您的问题:

System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
FileClose(1)
Return False

A 使用会有所帮助:

Using _fs as System.Io.FileStream = System.IO.File.Open(filename, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
End Using
Return False

File.Open Returns 文件流,而不是 FileClose 所需的整数

据我所知,您正在尝试使用 System.IO.File.Open 在播放前检查文件是否存在,但是您可以使用 File.Exists.

方法 File.Exists 来自 System.IO returns true 如果文件存在于路径中 returns false 否则

还有你这里做错了,

While CheckFile(fileName)
End While

如果找到文件,它将进入无限循环,除了重复调用 CheckFile 之外什么都不做。如果未找到文件,它将跳出循环并尝试 Audio.PlayFileSystem.DeleteFile,您最终会得到一个文件未找到异常。

这是你的代码修改后的工作。

Imports System.IO

Module Module1

    Sub Main()
        Dim fileName As String
        fileName = "C:\temp\Burst\Burst.wav"

        While CheckFile(fileName)
            Try
                My.Computer.Audio.Play(fileName, AudioPlayMode.WaitToComplete)
                'Delete statement here if you want file to be deleted after playback
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End While


        My.Computer.FileSystem.DeleteFile(fileName)
        Console.ReadLine()

    End Sub


    Private Function CheckFile(ByVal filename As String) As Boolean

        If (File.Exists(filename)) Then
            Return True
        Else
            Return False
        End If

    End Function
End Module