![]() |
|
|
#1
|
|||
|
|||
|
Помогите ребят! Есть большое кол-во каталогов расположенных в сети. Программа производит поиск файлов во всех вложенных в них каталогах и к некоторым каталогам нет доступа(нету прав и т.п.). Естественно при попытки войти в этот каталог программа вылетает с ошибкой. Как грамотно проверить каталог на доступность? Интернет помог только способом попробовать создать файл в каталоге и отловить ошибку. Не хотелось бы пользоваться данным способом. Заранее спасибо за помощь!
|
|
#2
|
||||
|
||||
|
Цитата:
Используй для поиска FindFirst, FindNext, FindClose. |
|
#3
|
|||
|
|||
|
Цитата:
Я этим и пользуюсь. Вот код. Код:
procedure FindFile(Dir:String);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(Dir,faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) then
begin
FindFile(Dir+SR.Name+'');
FindRes:=FindNext(SR);
Continue;
end;
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;При поиске к примеру на локальном диске проблем не возникает. Последний раз редактировалось listerine, 13.01.2014 в 15:33. |
|
#4
|
||||
|
||||
|
Цитата:
Какую ошибку выдаёт у тебя этот код? p.s. На этом форуме запрещено исходный код выкладывать в виде обычного текста, можно только обрамляя его тегом [code] - исправь - иначе модераторы тебя заблокируют. |
|
#5
|
|||
|
|||
|
Цитата:
Все что вы сказали все это есть. Прошу прощения, но я это вырезал не предав этому значения, так как думаю проблема в другом. Ошибка "Отказано в доступе". Вот код. Код:
procedure FindFile(Dir:String);
Var SR:TSearchRec;
FindRes:Integer;
begin
Dir := IncludeTrailingPathDelimiter(Dir);
FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name='.')or(SR.Name='..')) then
begin
FindRes:=FindNext(SR);
Continue;
end;
if ((SR.Attr and faDirectory)=faDirectory) then
begin
FindFile(Dir+SR.Name+'');
FindRes:=FindNext(SR);
Continue;
end;
FindRes:=FindNext(SR);
end;
FindClose(SR);
end; |
|
#6
|
|||
|
|||
|
|
|
#7
|
||||
|
||||
|
Цитата:
И ещё, я уже много лет пользуюсь примерно таким вариантом поиска: Код:
procedure FindFile(Dir: String);
var
SR: TSearchRec;
begin
Dir := IncludeTrailingPathDelimiter(Dir);
if FindFirst(Dir + '*.*', faAnyFile, SR) = NO_ERROR then
try
repeat
if (SR.Attr and faDirectory) = 0 then // Если это файл
begin
// Что-то делаем с файлом Dir+sr.Name
end else // Если же это каталог
begin
if (SR.Name <> '.') and (SR.Name <> '..') then FindFile(Dir + SR.Name);
end;
until FindNext(SR) <> NO_ERROR;
finally
FindClose(SR);
end;
end; |
|
#8
|
|||
|
|||
|
Цитата:
Спасибо что помогаете. Вы правы, при работе приложения ошибки не вылетает, оно просто зависает и все. Протестил только что ваш код, но к сожалению ошибка такая же. Каталогов в сети очень много и угадать к какому нет доступа не представляется возможным. Я ж правильно понимаю она и должна вылететь с ошибкой при попытки поиска в недоступном каталоге? |
|
#9
|
||||
|
||||
|
Цитата:
|
|
#10
|
|||
|
|||
|
Цитата:
Зависает оно капитально. Я в ваш код добавил лишь проверку на совпадение, к примеру имя файла = 123 если да то добавляется в листбокс. Буду дальше искать косяк. Спасибо за помощь. |
|
#11
|
|||
|
|||
|
Вот, может на какие-то мысли наведет:
http://stackoverflow.com/questions/1...led-with-acces Вообще, можно просто попробовать открыть найденный каталог через OpenFile сначала, а потом уже лезть внутрь... |