MainWindow.CreateFile始终返回-1

时间:2016-08-25 20:14:42

标签: c# wpf

在我将一些文件复制到C#后,我试图用C#弹出USB驱动器。

然而,在阅读了很多如何做到这一点的例子后,我无法为我工作。

res = np.zeros((4664605, 4664605), dtype=arg.dtype)
res[:,:4] = arr

我如何称呼它:

[DllImport("kernel32.dll")]
public static extern uint GetLastError();

[DllImport("kernel32", SetLastError = true)]
private static extern IntPtr CreateFile
    (string filename, uint desiredAccess,
        uint shareMode, IntPtr securityAttributes,
        int creationDisposition, int flagsAndAttributes,
        IntPtr templateFile);

我的驱动器号是string path = "\\\\.\\" + driveLetter + ":"; IntPtr handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); MessageBox.Show(GetLastError().ToString());//gives me zero 所以它只是把它放在字符串中并尝试打开文件(我不太确定),我希望它是驱动器这样我就可以弹出USB拇指驱动器了。

问题是K总是handle

我格式化-1字符串错了吗?或者我是否错误地使用path方法来获取要弹出的驱动器的句柄?

相关:

ORDER BY

Eject USB device via C#(以及相关链接)

1 个答案:

答案 0 :(得分:1)

找到答案here (Eject USB device via C#, see Roger Deep's answer)

简答:

IntPtr handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 
    FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, 0x3, 0, 
    IntPtr.Zero);

我不知道它有什么不同,但是它给了我正确的驱动器句柄,其余代码现在可用了!

答案很长,我的完整代码是移除USB驱动器(WPF窗口):

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    EjectDrive('K');
}
void EjectDrive(char driveLetter)
{
    string path = @"\\.\" + driveLetter + @":";
    IntPtr handle = CreateFile(path, GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, 0x3, 0, IntPtr.Zero);

    if ((long)handle == -1)
    {
        MessageBox.Show("Unable to open drive " + driveLetter);
        return;
    }

    int dummy = 0;

    DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0,
        IntPtr.Zero, 0, ref dummy, IntPtr.Zero);

    CloseHandle(handle);

    MessageBox.Show("OK to remove drive.");
}
[DllImport("kernel32", SetLastError = true)]
private static extern IntPtr CreateFile
    (string filename, uint desiredAccess,
        uint shareMode, IntPtr securityAttributes,
        int creationDisposition, int flagsAndAttributes,
        IntPtr templateFile);
[DllImport("kernel32")]
private static extern int DeviceIoControl
    (IntPtr deviceHandle, uint ioControlCode,
        IntPtr inBuffer, int inBufferSize,
        IntPtr outBuffer, int outBufferSize,
        ref int bytesReturned, IntPtr overlapped);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr hObject);