2014-12-18 1 views
0

У меня есть функция, которая проверяет, является ли диск (CD/DVD, ключ USB, флоппи-ОК) ...Ошибка DiskSize Delphi

Он работал отлично ... Если это меньше, чем 0 ... Это возвращается, что нет подключенного накопителя ...

Большая проблема, я удалил свой pendrive, не выбрасывая ;;; Я вытащил PENDRIVE ... Поэтому функция DiskSize возвращает следующую ошибку:

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

Как исправить эту ошибку ... потому, что функция работает нормально ... Просто DiskSize, который генерирует эту ошибку, то Дело в том, что я puzado палки без Eject ...

// 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; 

Моей системы Windows 7 64bit ... Я нашел, генерируется ошибка, так как удаляется карта памяти принтера ... Но проблема в том, что это card compatilhado Network ... Когда я удаляю сетевой ресурс ... он не генерирует ошибку ...

screenshot

+0

Можем ли мы иметь полную программу, которая дает вывод, который вы показываете. –

+0

Какая версия Windows у вас есть? Причина, по которой я прошу об этом, заключается в том, что на прошлой неделе, когда я установил Windows 8.1 на новый компьютер с мамами (я никогда раньше не использовал Windows 8.1), я заметил, что каждый новый USB-накопитель или внешний жесткий диск получают свою собственную букву диска даже если я уже удалил ранее используемый флеш-накопитель USB или внешний жесткий диск. Я даже заметил, что в Windows 8.1 перечислены съемные устройства, такие как USB-флеш-накопители или External HSS, в диспетчере устройств с буквой диска, которую они им назначили. – SilverWarior

+0

Таким образом, возможно, что ваша программа пытается получить размер диска с отключенного устройства, потому что в окнах все еще есть 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 дает размер в байтах данного Диска. Если диск недействителен или нет носителя, возвращается -1. и ваша функция DriveOK() возвращает значение True, если диск недействителен (-1)? –

+0

Я видел это, но я оставил его как есть, потому что это то, что сделал исходный код OP. Все, что я сделал, это добавить код для отключения/повторного включения режима ошибок ОС. –

+0

Действительно .... это потому, что я начинаю в Delphi ... Этого было достаточно, чтобы поставить 'Result: = DiskSize (I)> = 0;' ... Он отлично работал ... но подсказка на 'SetErrorMode', поможет мне в будущие коды ... Спасибо ... – abcd

-1

Эй друзья это произошло потому, что Windows 7 магазинов некоторые кэш файлы в любом вставленном pendrive, и когда вы вытаскиваете его, не выгружая эти файлы, вы неправильно разбираетесь и вызывают массу проблем. Вы можете избежать этого, отключив «хранилище кеш-файлов» на своем pendrive в windows os. Для этого довольно сложный и долгий процесс я предоставляю ссылку, которую вы можете использовать, чтобы избежать подобных проблем. http://www.rybersoft.com/2016/05/how-to-disable-write-caching-by-windows.html