C#PInvoke我无法使用CreateFile打开卷

问题描述 投票:-1回答:1

我必须使用PInvoke的CreateFile打开卷:

[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs, FileMode dwCreationDisposition, FileOptions dwFlagsAndAttributes, IntPtr hTemplateFile);

但是当我使用它时:

var fileName = @"C:\Users\myuser\Desktop\file.txt"
var root = Path.GetPathRoot(fileName);
var volumePath = @"\\.\" + root.Substring(0, root.Length - 1);

var volume = CreateFile(volumePath, GENERIC_READ, FileShare.Read, IntPtr.Zero, FileMode.Open, FileOptions.None, IntPtr.Zero);
if (volume.IsInvalid)
    throw new Win32Exception(Marshal.GetLastWin32Error());

它打印:

拒绝访问

但是,如果我以提升的特权打开它,则会打印:

该进程无法访问该文件,因为它正在被另一个进程使用

我一直在尝试所有事情,甚至从很多地方获取代码,但我无法使其正常工作。

c# pinvoke kernel32
1个回答
0
投票

使用取自here的PInvoke代码:

var volume = CreateFile(volumePath, EFileAccess.GenericRead, EFileShare.Read|EFileShare.Write, IntPtr.Zero, ECreationDisposition.OpenExisting, 0, IntPtr.Zero);

我设法使其正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.