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

时间:2015-02-05 14:38:18

标签: vb.net wav audio-player

我目前正在使用控制台应用程序来播放新创建的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创建的。我发现它here。然而,遗憾的是,此函数导致异常,因为它在运行后无法访问该文件,因为它正由另一个进程使用。如果我删除此功能,则可以打开,播放和删除该文件。

例外内容如下:

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

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

-Josh

2 个答案:

答案 0 :(得分:0)

这是你的问题:

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

使用将有助于:

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返回Filestream,而不是FileClose所需的整数

答案 1 :(得分:0)

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

如果文件存在于路径上,File.Exists的方法System.IO将返回true,否则返回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