Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
Пропустить файл/папку с закрытым доступом
 
Пишу сканер. На диске имеются файлы и папки к которым доступ закрыт.
Сейчас сканер останавливается как только найдет такую папку, а нужно чтобы такие папки пропускались и сканирование продолжалось дальше.
Вот код:
Код
void  checkFile(const char* FileName)
{
   printf("Сканируется: %s\n",FileName);

   HANDLE hFile = CreateFileA(FileName, FILE_READ_ACCESS, NULL, NULL, OPEN_EXISTING,NULL,NULL);
   if(hFile == INVALID_HANDLE_VALUE)
   {
      printf("\nОшибка открытия файла\n");
   }

   DWORD FileSize = GetFileSize(hFile, NULL);

   HANDLE hMap = CreateFileMappingA(hFile, NULL, PAGE_READONLY, NULL, FileSize,NULL);
   if(hFile == INVALID_HANDLE_VALUE)
   {
      printf("Ошибка создания объекта отображения файла в память\n");
      CloseHandle(hFile);
   }

   LPVOID File = MapViewOfFile(hMap,FILE_MAP_READ, NULL, NULL, FileSize);
   if(File==NULL)
   {
      printf("Ошибка отображения объекта файла в адресное пространство\n");
      CloseHandle(hMap);
      CloseHandle(hFile);
      scanf("%d");
   }

   ...

   UnmapViewOfFile(File);
   CloseHandle(hMap);
   CloseHandle(hFile);

        ...
}


Как при сканировании пропустить файлы и папки к которым закрыт доступ?
Изменено: Digan - 18.05.2010 01:53:29
 
У вас полная путаница
открываете hMap, а проверяете почему то hFile
HANDLE hMap = CreateFileMappingA(hFile, NULL, PAGE_READONLY, NULL, FileSize,NULL);
if(hFile == INVALID_HANDLE_VALUE)

Вот как надо правильно делать
Код
void  checkFile(const char* FileName){
  printf("Сканируется: %s\n",FileName);

  HANDLE hFile = CreateFileA(FileName, FILE_GENERIC_READ, NULL, NULL, OPEN_EXISTING,NULL,NULL);
  if(hFile != INVALID_HANDLE_VALUE){
    DWORD FileSize = GetFileSize(hFile, NULL);
    HANDLE hMap = CreateFileMappingA(hFile, NULL, PAGE_READONLY, NULL, FileSize,NULL);
    if(hMap != INVALID_HANDLE_VALUE){
      LPVOID FileMem = MapViewOfFile(hMap,FILE_MAP_READ, NULL, NULL, FileSize);
      if(FileMem!=NULL){
        scanf("%d");
//     Сканируем  .....

        UnmapViewOfFile(FileMem);
      }  else{//      if(FileMem!=NULL)
      printf("Ошибка MapViewOfFile\n");
      }
     CloseHandle(hMap);
    }else{//     if(hMap !== INVALID_HANDLE_VALUE)
     printf("Ошибка CreateFileMappingA\n");
    };

    CloseHandle(hFile);
   }else{//  if(hFile != INVALID_HANDLE_VALUE)
    printf("Ошибка CreateFileA\n");
   }
}


Только учтите, что файлы объёмом свыше 500 мегабайт вы так не откроете, MapViewOfFile выдаст ошибку. Предел в 500м зависит от операционной системы и среды разработки. Так что либо открывайте большие файлы по частям MapViewOfFile(hMap,ILE_MAP_READ,Offset /(128*1024*1024),Offset &(128*1024*1024-1),128*1024*1024), либо читайте большой файл по обычному, через ReadFile
 
Спасибо. В коде несколько синтаксических ошибок, но ничего -исправил.
Сканировать стало заметно медленней чем раньше.
 
Просто переставив местами IF программа не могла замедлится, даже если сравнивать по тактам CPU.
Как вариант причина замедления это вывод/ввод с консоли.
Кстати я изначально упустил scanf("%d") это вообще мне непонятно.
 
Цитата
Mity Hiden пишет:
Кстати я изначально упустил scanf("%d") это вообще мне непонятно.
Это типа остановка в случае если файл/папка не читаются. Иначе раньше просто программа падала как находила подобный файл.
 
Digan,
Mity Hiden,

Ребята, кидаю Вам обоим идею - лезете сюда http://farmanager.com/svn/trunk/unicode_far/ и смотрите как реализован механизм эскалации привилегий в Far 2.0. Что-то начиная с билда 2.0.1465 я про сию "проблему" особо и не слышу. :D  Вот Вам выдержка из changelog:
Цитата
drkns 30.03.2010 00:44:57 +0200 - build 1465

1. Начальная поддержка повышения полномочий при работе из-под ограниченной учётной записи.

  С полномочиями администратора в данный момент могут быть выполнены следующие операции:
  - создание папок;
  - удаление папок;
  - удаление файлов;
  - установка атрибутов;
  - создание символических ссылок.

  Со временем этот список будет расти.
а с 2.0.1522 эта проблема для Far вообще не существует как явление - можно работать хоть в /System Volume Information/ для которого в ACL один пользователь стоит - System - привилегии процесса поднимаются при необходимости до уровня привилегий локальной системы, и проблема испаряется в зародыше. Хотите потестить на опыте? Портабельный вариант устроит? Или полный устанавливаемый? Идите ко мне в http://filekeeper.org/download/victorvg/Software/File_Managment и берите браузером что надо. После щелчка на имени файла откроется страница его загрузки и через максимум 10 сек он польётся. Докачка поддерживается.

P.S.

А коли нужно что иное - полазьте по амбарчику - у меня там много вкусного лежит. :D
Изменено: VictorVG - 19.05.2010 13:27:55
Страницы: 1
Читают тему