yhxhappy 发表于 2012-5-7 22:46:07

[已解决] 如何判断分区是 写保护状态 或 不可写状态?

本帖最后由 yhxhappy 于 2012-5-8 08:40 编辑

我试了 FileOpen 或 FileCopy,Iniwrite等方法,在不可写的分区内操作,都提示下图警告框:


我想能判断不可写又不弹出对话框。P版曾回答过类似问题:
判断是否有写入保护,发送IOCTL_DISK_IS_WRITABLE控制请求。

因水平有限,不知道上面说的方法什么用?

pusofalse 发表于 2012-5-7 23:52:03


Const $DISK_PATH = "\\.\H:"

Const $IOCTL_DISK_IS_WRITABLE = 0x70024
Const $GENERIC_READ = 0x80000000
Const $ERROR_WRITE_PROTECT = 19


Local $hDiskDrive, $iStatus

$hDiskDrive = DllCall("Kernel32.dll", "handle", "CreateFileW", "wstr", $DISK_PATH, "dword", $GENERIC_READ, "long", 3, "ptr", 0, "dword", 3, "long", 0, "handle", 0)
$hDiskDrive = $hDiskDrive

$iStatus = DllCall("Kernel32.dll", "bool", "DeviceIoControl", "handle", $hDiskDrive, "dword", $IOCTL_DISK_IS_WRITABLE, "ptr", 0, "long", 0, "ptr", 0, "long", 0, "long*", 0, "ptr", 0)

If $iStatus Then
        MsgBox(48, "OK", StringFormat("'%s' is writable.", $DISK_PATH))
Else
        $iStatus = DllCall("Kernel32.dll", "long", "GetLastError")

        If $iStatus = $ERROR_WRITE_PROTECT Then
                MsgBox(48, "OK", StringFormat("'%s' is read-only.", $DISK_PATH))
        Else
                MsgBox(48, "Error", StringFormat("Cannot determine, error code: %d", $iStatus))
        EndIf
EndIf

DllCall("Kernel32.dll", "bool", "CloseHandle", "handle", $hDiskDrive)

lxz 发表于 2012-5-8 08:02:35

谢 谢 代 码.

楼上风云 发表于 2012-5-8 08:22:10

回复 1# yhxhappy
2楼超版已经给出解答,建议楼主将贴修改为“已解决”

yhxhappy 发表于 2012-5-8 08:41:32

感谢P版的代码
页: [1]
查看完整版本: [已解决] 如何判断分区是 写保护状态 或 不可写状态?