Winapi 如何为网络路径使用CreateFile API函数?

Winapi 如何为网络路径使用CreateFile API函数?,winapi,filesystems,network-share,Winapi,Filesystems,Network Share,我遇到了C驱动器的CreateFile API。它工作得很好。但当我尝试使用网络共享路径时,它会抛出一个错误 private void GetRootHandle() { string vol = string.Concat(@"\\192.168.1.24\share1"); _changeJournalRootHandle = PInvokeWin32.CreateFile(vol, PInvokeWin32.GENERIC_

我遇到了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函数的共享路径吗

我正在获取访问被拒绝的异常


那是因为它不是一个文件。如果不使用CreateFile(),则不必这样做。使用常规的.NET类,如DirectoryInfo.EnumerateFiles()枚举文件,使用FileStream打开文件。如果需要pinvoke GetFileInformationByHandle(),请使用FileStream.SafeFileHandle属性。

导致拒绝访问错误的原因是您没有权限以请求的权限打开文件或文件夹。在这种情况下,读和写。不需要写入权限。您应该从
desiredAccess
(第二)参数中删除
PInvokeWin32.GENERIC\u WRITE

MSDN文档表示您可以将0传递给
desiredAccess
参数,并使用
GetFileInformationByHandle
中的句柄

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


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

您是否应该指向该共享上的文件1?aka\\192.168.1.24\share1\somefile.txt?嗨,这里我需要使用另一个API函数GetFileInformationByHandle来枚举根文件夹share1下的所有文件,而不是一个特定的文件。在这种情况下不是更好的开始吗?我不知道如何使用api枚举文件。为什么你不能使用System.IO托管类?我需要获取特定文件或文件夹的唯一ID,该文件或文件夹仅在BY\u HANDLE\u file\u信息中可用。请浏览链接,也是这一个。非常感谢你的回答。。。FileStream.SafeFileHandle适合我…我很高兴看到像你这样的人..请永远继续你的服务。嗨,你知道从UNC路径(\\192.168.1.124\share)获取绝对路径(C:\share)吗?在服务器机器上运行你的程序会更容易。但肯定不是您想要的。我正在从一台服务器(devServer)运行该程序,并试图从远程服务器(192.168.1.124)获取文件信息