Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.01.2014, 14:28
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию Проверка каталога

Помогите ребят! Есть большое кол-во каталогов расположенных в сети. Программа производит поиск файлов во всех вложенных в них каталогах и к некоторым каталогам нет доступа(нету прав и т.п.). Естественно при попытки войти в этот каталог программа вылетает с ошибкой. Как грамотно проверить каталог на доступность? Интернет помог только способом попробовать создать файл в каталоге и отловить ошибку. Не хотелось бы пользоваться данным способом. Заранее спасибо за помощь!
Ответить с цитированием
  #2  
Старый 13.01.2014, 14:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от listerine
Помогите ребят! Есть большое кол-во каталогов расположенных в сети. Программа производит поиск файлов во всех вложенных в них каталогах и к некоторым каталогам нет доступа(нету прав и т.п.). Естественно при попытки войти в этот каталог программа вылетает с ошибкой.
Каким образом ты выполняешь поиск файлов, что даже программа вылетает с ошибкой?
Используй для поиска FindFirst, FindNext, FindClose.
Ответить с цитированием
  #3  
Старый 13.01.2014, 15:16
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
Каким образом ты выполняешь поиск файлов, что даже программа вылетает с ошибкой?
Используй для поиска FindFirst, FindNext, FindClose.

Я этим и пользуюсь. Вот код.

Код:
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  
Старый 13.01.2014, 15:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от listerine
Я этим и пользуюсь. Вот код.
Этот код ошибку выдавать не должен, разве что "Ошибку переполнения стека" из-за бесконечной рекурсии (так как обратный слэш в путь не добавляется и не проверяется на папки-исключения '.' и '..').
Какую ошибку выдаёт у тебя этот код?

p.s. На этом форуме запрещено исходный код выкладывать в виде обычного текста, можно только обрамляя его тегом [code] - исправь - иначе модераторы тебя заблокируют.
Ответить с цитированием
  #5  
Старый 13.01.2014, 15:44
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
Этот код ошибку выдавать не должен, разве что "Ошибку переполнения стека" из-за бесконечной рекурсии (так как обратный слэш в путь не добавляется и не проверяется на папки-исключения '.' и '..').
Какую ошибку выдаёт у тебя этот код?

p.s. На этом форуме запрещено исходный код выкладывать в виде обычного текста, можно только обрамляя его тегом [code] - исправь - иначе модераторы тебя заблокируют.

Все что вы сказали все это есть. Прошу прощения, но я это вырезал не предав этому значения, так как думаю проблема в другом. Ошибка "Отказано в доступе".

Вот код.

Код:
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  
Старый 13.01.2014, 15:50
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Вот скриншот http://hostingkartinok.com/show-imag...be99f75f500728
Ответить с цитированием
  #7  
Старый 13.01.2014, 16:12
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от listerine
Во-первых эту ошибку выдаёт отладчик (а не приложение), что ещё не означает что ошибка действительно имеется (хотя в твоём случае это скорее всего не так). Во-вторых в приведённом тобой коде нет ничего что вызывало бы это исключение, я только что специально у себя проверил на Delphi 7 и Delphi XE2.

И ещё, я уже много лет пользуюсь примерно таким вариантом поиска:
Код:
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  
Старый 13.01.2014, 16:27
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
Во-первых эту ошибку выдаёт отладчик (а не приложение), что ещё не означает что ошибка действительно имеется (хотя в твоём случае это скорее всего не так). Во-вторых в приведённом тобой коде нет ничего что вызывало бы это исключение, я только что специально у себя проверил на Delphi 7 и Delphi XE2.

Спасибо что помогаете. Вы правы, при работе приложения ошибки не вылетает, оно просто зависает и все. Протестил только что ваш код, но к сожалению ошибка такая же. Каталогов в сети очень много и угадать к какому нет доступа не представляется возможным. Я ж правильно понимаю она и должна вылететь с ошибкой при попытки поиска в недоступном каталоге?
Ответить с цитированием
  #9  
Старый 13.01.2014, 16:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от listerine
Спасибо что помогаете. Вы правы, при работе приложения ошибки не вылетает, оно просто зависает и все. Протестил только что ваш код, но к сожалению ошибка такая же. Каталогов в сети очень много и угадать к какому нет доступа не представляется возможным. Я ж правильно понимаю она и должна вылететь с ошибкой при попытки поиска в недоступном каталоге?
Нет. Тот код что я привёл исключений доступа вызывать не должен. Если к какой папке не будет доступа, то FindFirst просто вернёт код ошибки ERROR_ACCESS_DENIED вместо NO_ERROR, а окно с исключением "Отказано в доступе" у тебя вызывает что-то другое - то что ты ещё добавляешь к этому коду. Да и зависнуть на небольшой промежуток времени этот код может только разве что если выключить удалённый компьютер.
Ответить с цитированием
  #10  
Старый 13.01.2014, 16:57
listerine listerine вне форума
Прохожий
 
Регистрация: 20.03.2013
Сообщения: 41
Версия Delphi: Delphi XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от poli-smen
Нет. Тот код что я привёл исключений доступа вызывать не должен. Если к какой папке не будет доступа, то FindFirst просто вернёт код ошибки ERROR_ACCESS_DENIED вместо NO_ERROR, а окно с исключением "Отказано в доступе" у тебя вызывает что-то другое - то что ты ещё добавляешь к этому коду. Да и зависнуть на небольшой промежуток времени этот код может только разве что если выключить удалённый компьютер.

Зависает оно капитально. Я в ваш код добавил лишь проверку на совпадение, к примеру имя файла = 123 если да то добавляется в листбокс. Буду дальше искать косяк. Спасибо за помощь.
Ответить с цитированием
  #11  
Старый 13.01.2014, 18:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот, может на какие-то мысли наведет:
http://stackoverflow.com/questions/1...led-with-acces

Вообще, можно просто попробовать открыть найденный каталог через OpenFile сначала, а потом уже лезть внутрь...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter