0

我正在使用如下所示的 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;
4

2 回答 2

1

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

CreateFile 函数 (Windows)

目录

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

于 2013-03-18T13:46:32.013 回答
0

Why are you using unmanaged code here? Try the standard managed options:

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

}
于 2013-03-18T07:02:01.527 回答