【问题标题】:using CreateFile on c# returns isInvalid = true在 c# 上使用 CreateFile 返回 isInvalid = true
【发布时间】:2013-03-18 06:56:17
【问题描述】:

我正在使用如下所示的 CreateFile,并且不断获取 isInvalid = true,没有计量我所做的事情,但是,从“Marshal.GetLastWin32Error”返回的错误代码正在根据我尝试访问的路径而变化。

以下是路径及其对应的错误代码:

  1. @lpFileName = "c:\" -> 3
  2. @lpFileName = "\\127.0.0.1\share\" -> 123
  3. @lpFileName = "c:\share\" -> 5

显然 "c:\" 确实存在,据我所知 "\\127.0.0.1\share\" 是一个有效的 UNC 我将所有可能的权利授予目标计算机上的每个人,包括 NTFS 和共享。 这些都没有意义。

我的系统是Server 2008R2 请帮忙。

创建文件:

[DllImport("kernel32.dll", SetLastError = true)]
    static extern SafeFileHandle CreateFile(
        LPCTSTR lpFileName,
        DWORD dwDesiredAccess,
        DWORD dwShareMode,
        LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        DWORD dwCreationDisposition,
        DWORD dwFlagsAndAttributes,
        HANDLE hTemplateFile
        );

使用以下标志:

DWORD dwIoControlCode,
        LPCTSTR lpFileName,
        DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE,
        DWORD dwShareMode = FILE_SHARE_WRITE|FILE_SHARE_READ,
        LPSECURITY_ATTRIBUTES lpSecurityAttributes = default(LPSECURITY_ATTRIBUTES),
        DWORD dwCreationDisposition = OPEN_EXISTING,
        DWORD dwFlagsAndAttributes = 0,
        HANDLE hTemplateFile = default(IntPtr)
        )

和标志值:

 public const DWORD
        GENERIC_READ = 0x80000000,
        GENERIC_WRITE = 0x40000000,
        FILE_SHARE_WRITE = 0x2,
        FILE_SHARE_READ = 0x1,
        OPEN_EXISTING = 0x3;

【问题讨论】:

  • 当您可以对托管代码执行相同操作时,为什么要保持无损?
  • 我需要获取 UNC 的驱动器信息我只使用 CreateFile 来获取句柄
  • 您需要什么样的信息?
  • msdn.microsoft.com/en-us/library/windows/desktop/… 阅读本文中的目录部分。
  • 这个问题很奇怪。 isInvalid 是什么?进行调用的代码在哪里。这就是问题所在。

标签: c# c++ winapi io pinvoke


【解决方案1】:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx

CreateFile 函数 (Windows)

目录

要使用 CreateFile 打开目录,请将 FILE_FLAG_BACKUP_SEMANTICS 标志指定为 dwFlagsAndAttributes 的一部分。

【讨论】:

    【解决方案2】:

    你为什么在这里使用非托管代码?尝试标准托管选项:

    using(var fs = new FileStream(...)){
    
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 2011-12-20
    • 2016-01-17
    • 1970-01-01
    • 2012-02-27
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多