如何正确关闭保存文件句柄

2024-05-11

我正在开发一个与 USB 设备通信的 C# 项目。我打开连接:

[DllImport("Kernel32.dll", SetLastError = true)]
static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string filename,  [MarshalAs(UnmanagedType.U4)]FileAccess fileaccess, [MarshalAs(UnmanagedType.U4)]FileShare fileshare, int securityattributes, [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition, int flags, IntPtr template);
private Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle;

...

safeFileHandle = CreateFile("\\\\.\\HsiUsb1", FileAccess.ReadWrite,FileShare.ReadWrite, 0, FileMode.Create, 0, IntPtr.Zero);

if (safeFileHandle.IsInvalid)
{
      return Marshal.GetLastWin32Error();
}
var HsiPort = new FileStream(safeFileHandle, FileAccess.ReadWrite);
if (!HsiPort.CanRead)
{
     return -1;
}

连接关闭:

if (HsiPort != null)
{
    HsiPort.Close();                
    HsiPort = null;
}

if (safeFileHandle != null)
{
    safeFileHandle.Close();               
    safeFileHandle = null;
}

只要我同步地从 FileStream 读取和写入数据,一切都很好,我可以多次关闭和打开 USB 连接。然而,由于 USB 设备在某些事件发生时发送数据,并且不知道发送了多少字节,因此程序将卡在 FileStream.Read() 上。 于是我开始用FileStream.BeginRead()和EndRead()异步读取数据。一切正常,但是,当我关闭连接并再次启动它时,句柄无效并且获得的错误代码为 5。 谁能帮我这个?如何正确关闭 SafeFileHandle? 提前致谢


尝试使用 using 语句作为基础SafeFileHandle实现 IDisposable。

以下内容应该可以正常工作:

    [DllImport("Kernel32.dll", SetLastError = true)]
    static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string filename, [MarshalAs(UnmanagedType.U4)]FileAccess fileaccess, [MarshalAs(UnmanagedType.U4)]FileShare fileshare, int securityattributes, [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition, int flags, IntPtr template);
    //private Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle;

    public static int doSomething()
    {
        using (var safeFileHandle = CreateFile("\\\\.\\HsiUsb1", FileAccess.ReadWrite, FileShare.ReadWrite, 0, FileMode.Create, 0, IntPtr.Zero))
        {
            if (safeFileHandle.IsInvalid)
            {
                return Marshal.GetLastWin32Error();
            }
            using (var HsiPort = new FileStream(safeFileHandle, FileAccess.ReadWrite))
            {
                if (!HsiPort.CanRead)
                {
                    return -1;
                }
            }
        }

        return 0;
    }

如果您想稍后在另一个方法中使用文件句柄。请删除第一个 using 块。然后,当您完成该文件的工作时,您必须确保正确处理该句柄。

实施IDisposable你自己在班级中并处理资源将是做到这一点的一种(好)方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确关闭保存文件句柄 的相关文章

随机推荐