【问题标题】:How to use CreateFile API function for network path?如何将 CreateFile API 函数用于网络路径?
【发布时间】:2013-05-11 09:58:18
【问题描述】:

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

【问题讨论】:

标签: winapi filesystems network-share


【解决方案1】:

我收到访问被拒绝异常

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

【讨论】:

  • 非常感谢您的回答... FileStream.SafeFileHandle 为我解决了...我很高兴看到像您这样的人..请永远继续您的服务。
  • 嗨,你知道从 UNC 路径(\\192.168.1.124\share)获取绝对路径(C:\share)吗?
  • 在服务器机器上运行程序会更容易。但肯定不是你想要的。
  • 我正在从一台服务器(devServer)运行程序并尝试从远程服务器(192.168.1.124)获取文件信息
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多