3

我遇到了 C 盘的 CreateFile API。它工作正常。但是当我尝试使用网络共享路径时,它会引发错误。

private void GetRootHandle()
    {
        string vol = string.Concat(@"\\192.168.1.24\share1");
        _changeJournalRootHandle = PInvokeWin32.CreateFile(vol,
             PInvokeWin32.GENERIC_READ | PInvokeWin32.GENERIC_WRITE,
             PInvokeWin32.FILE_SHARE_READ | PInvokeWin32.FILE_SHARE_WRITE,
             IntPtr.Zero,
             PInvokeWin32.OPEN_EXISTING,
             0,
             IntPtr.Zero);
        if (_changeJournalRootHandle.ToInt32() == PInvokeWin32.INVALID_HANDLE_VALUE)
        {
            throw new IOException("CreateFile() returned invalid handle",
                new Win32Exception(Marshal.GetLastWin32Error()));
        }
    }

谁能给我一个想法如何使用此 API 功能的共享路径

4

2 回答 2

2

我收到访问被拒绝异常

那是因为它不是一个文件。通过使用 CreateFile() 来获得成功,它只是没有必要。使用常规的 .NET 类,例如 DirectoryInfo.EnumerateFiles() 来枚举文件,使用 FileStream 来打开它们。如果需要调用 GetFileInformationByHandle(),请使用 FileStream.SafeFileHandle 属性。

于 2013-05-11T11:17:08.223 回答
1

访问被拒绝错误是因为您没有使用您请求的权限打开文件或文件夹的权限。在这种情况下,读写。 GetFileInformationByHandle不需要写权限。您应该PInvokeWin32.GENERIC_WRITEdesiredAccess(2nd) 参数中删除。

CreateFile的 MSDN 文档说您可以将 0 传递给desiredAccess参数并使用GetFileInformationByHandle.

dwDesiredAccess 参数可以为零,如果应用程序以足够的安全设置运行,则允许应用程序查询文件属性而不访问文件。这对于在不打开文件进行读取和/或写入访问的情况下测试文件的存在或获取有关文件或目录的其他统计信息很有用。请参阅获取和设置文件信息和 GetFileInformationByHandle。

但是,C# 中的Directory类可能会更好地为您提供检索目录信息的服务。

于 2013-05-11T13:02:50.037 回答