2014-12-18 117 views
0

我有一個函數,檢查驅動器(CD/DVD,USB鑰匙,軟盤是否正常)...錯誤DiskSize德爾福

它的工作完美...如果它小於0 ...它返回沒有驅動器連接...

最大的問題,我刪除了我的U盤,沒有噴射;;;我把U盤......所以了disksize函數返回以下錯誤:

there is the disk in the drive. please insert a disk into drive device

如何解決這個錯誤......因爲功能是否正常工作...只是DiskSize是產生這個錯誤,事實上,我是puzado棒子沒有彈出...

// Check if drive is OK 
function DriveOK (Drive: Char): boolean; 
var 
I: byte; 
space: integer; 
begin 
   Drive: = upcase (Drive); 
   not if (Drive in ['A' .. 'Z']) then Begin 
     raise Exception.Create ('incorrect Unit'); 
   end; 

   I: = Ord (Drive) - 64; 
   if (DiskSize(I) >= 0) then Begin 
      Result: = false; 
   End Else Begin 
      Result: = true; 
   end; 
end; 

我的系統是64位Windows 7 ...我發現,因爲刪除的打印機內存卡生成錯誤......但問題是,這卡compatilhado網絡......當我刪除網絡共享......它不會產生錯誤......

screenshot

+0

我們可以有一個完整的程序,提供您顯示的輸出。 –

+0

你有哪個版本的Windows?爲什麼我問這個的原因是,當我已經安裝了Windows 8.1,以我的媽媽,上週新電腦(之前我從來沒有使用過Windows 8.1)我注意到,每一個新的USB閃存驅動器或外接硬盤獲得分配有自己的驅動器盤符即使我已經刪除了以前使用的USB閃存驅動器或外置硬盤。我甚至注意到Windows 8.1在設備管理器中列出了可移動設備,例如USB閃存驅動器或外部HSS,以及分配給它們的驅動器盤符。 – SilverWarior

+0

因此,您的程序可能會嘗試從disconected設備檢索磁盤大小,因爲windows仍然會爲其指定一個drkive字母。現在不幸的是我沒有訪問我的媽媽電腦來測試。 – SilverWarior

回答

3

您需要關閉Windows的內部錯誤報告禁用彈出錯誤對話框:

function DriveOK(Drive: Char): Boolean; 
var 
    I: byte; 
    mode: UINT; 
begin 
    Drive := UpCase(Drive); 
    if not (Drive in ['A' .. 'Z']) then begin 
    raise Exception.Create('incorrect Unit'); 
    end; 

    I := Ord(Drive) - 64; 

    mode := SetErrorMode(SEM_FAILCRITICALERRORS); 
    mode := SetErrorMode(mode or SEM_FAILCRITICALERRORS); 
    try 
    if (DiskSize(I) >= 0) then begin 
     Result := False; 
    end else begin 
     Result := True; 
    end; 
    finally 
    SetErrorMode(mode); 
    end; 
end; 

或者:

function DriveOK(Drive: Char): Boolean; 
var 
    I: byte; 
    mode: DWORD; 
begin 
    Drive := UpCase(Drive); 
    if not (Drive in ['A' .. 'Z']) then begin 
    raise Exception.Create ('incorrect Unit'); 
    end; 

    I := Ord(Drive) - 64; 

    SetThreadErrorMode(GetThreadErrorMode() or SEM_FAILCRITICALERRORS, @mode); 
    try 
    if (DiskSize(I) >= 0) then begin 
     Result := False; 
    end else begin 
     Result := True; 
    end; 
    finally 
    SetThreadErrorMode(mode, nil); 
    end; 
end; 
+1

我不明白爲什麼DriveOK()返回False,如果DiskSize> 0? DiskSize函數給出給定Drive的大小(以字節爲單位)。如果驅動器無效或無媒體,則返回-1!如果驅動器無效(-1),你的函數DriveOK()返回True? –

+0

我看到了,但我保持原樣,因爲這是OP的原始代碼所做的。我所做的只是添加代碼來禁用/重新啓用操作系統錯誤模式。 –

+0

真的......。這是因爲我從Delphi開始......這足以將Result = = DiskSize(I)> = 0;'......它完美運行......但是'SetErrorMode'上的提示將幫助我未來的代碼...謝謝... – abcd

-1

嘿朋友就發生了,因爲Windows 7將一些緩存插入任何pendrive中的文件,當您將其拉出而不彈出這些文件時會受到不當處理,並導致很多問題。您可以通過在windows操作系統中禁用pendrive上的「緩存文件存儲」來避免這種情況。由於這是相當複雜和漫長的過程,我正在提供一個鏈接,您可以使用它來進一步避免此類問題。 http://www.rybersoft.com/2016/05/how-to-disable-write-caching-by-windows.html