Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2012, 12:20   #1
3StYleR
 
Регистрация: 22.02.2011
Сообщений: 9
По умолчанию Права на доступ и сканирование папки

Доброго времени суток!
Подскажите пожалуйста, как в MSVC++ проверить эксклюзивные права на запись, и как сканировать определенную папку на наличие файлов с определенным расширением (например .png)
3StYleR вне форума Ответить с цитированием
Старый 25.11.2012, 13:52   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Что значить "проверить эксклюзивные права на запись"?
Для сканирования папок - FindFirstFile() и FindNextFile()
waleri вне форума Ответить с цитированием
Старый 25.11.2012, 14:41   #3
3StYleR
 
Регистрация: 22.02.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Что значить "проверить эксклюзивные права на запись"?
Т.е. надо проверить, открыт ли файл в другом приложении или нет, чтобы после того, как стороннее приложение "отпустит" файл, можно было его переместить в другую папку
3StYleR вне форума Ответить с цитированием
Старый 25.11.2012, 15:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Это скорее невозможно. Другое приложение не обязательно откроет файл в режиме эксклюзивного доступа.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2012, 15:29   #5
3StYleR
 
Регистрация: 22.02.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это скорее невозможно. Другое приложение не обязательно откроет файл в режиме эксклюзивного доступа.
Оkay. А просто проверить открыт файл в другом приложении или нет можно?
3StYleR вне форума Ответить с цитированием
Старый 25.11.2012, 16:29   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Хм... Я сталкивался однажды с этим.
Код чуть замученный, но все же выложу
Код:
function GetHandlesFileFromPID;
var SystemInformation: PSYSTEM_PROCESS_INFORMATION;
  pHandleInfo: PSYSTEM_HANDLE_INFORMATION_EX;
b:byte;  i:integer;    s:String;
cp,hp:Cardinal;hFile: THandle;
begin
 b:=GetFileHandleType;
SystemInformation:= GetInfoTable(5);
  if SystemInformation <> nil then
    pHandleInfo := GetInfoTable(16);
for I := 0 to pHandleInfo^.NumberOfHandles - 1 do
      begin
        if pHandleInfo^.Information[I].ObjectTypeNumber = b then
        begin
          hP := OpenProcess(PROCESS_DUP_HANDLE, True,
            pHandleInfo^.Information[I].ProcessId);
          if hP > 0 then
          try
            if DuplicateHandle(hP, pHandleInfo^.Information[I].Handle,
              GetCurrentProcess, @hFile, 0, False, DUPLICATE_SAME_ACCESS) then
            try
              if Application.Terminated then Exit;
              s := GetFileNameFromHandle(hFile);
//              caption:=IntToStr(cp);
             if (trim(s)<>'')and(pHandleInfo^.Information[I].ProcessId=PID)or(PID=MAXDWORD) then
               result:=result+({inttostr(pHandleInfo^.Information[I].ProcessId)+' '+}s)
               +#10#13;
            finally
              CloseHandle(hFile);
            end;
          finally
            CloseHandle(hP);
          end;
        end;
        Application.ProcessMessages;
      end;
end;
К ней нужна
Код:
function GetFileNameFromHandle(hFile: THandle): String;
  var
    lpExitCode: DWORD;
    pThreadParam: TGetFileNameThreadParam;
    hThread: THandle;
  begin
    Result := '';
    ZeroMemory(@pThreadParam, SizeOf(TGetFileNameThreadParam));
    pThreadParam.hFile := hFile;
    hThread := CreateThread(nil, 0, @GetFileNameThread, @pThreadParam, 0, PDWORD(nil)^);
    if hThread <> 0 then
    try
      case WaitForSingleObject(hThread, 100) of
        WAIT_OBJECT_0:
        begin
          GetExitCodeThread(hThread, lpExitCode);
          if lpExitCode = NT_STATUS($00000000){STATUS_SUCCESS} then
            Result := pThreadParam.Data;
        end;
        WAIT_TIMEOUT:
          TerminateThread(hThread, 0);
      end;
    finally
      CloseHandle(hThread);
    end;
  end;

//**************************************************************************
  function GetInfoTable(ATableType: DWORD): Pointer;
   const STATUS_INFO_LENGTH_MISMATCH = NT_STATUS($C0000004);
   var
     dwSize: DWORD;
     pPtr: Pointer;
     ntStatus: NT_STATUS;
   begin
     Result := nil;
     dwSize := WORD(-1);
     GetMem(pPtr, dwSize);
     ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
     while ntStatus = STATUS_INFO_LENGTH_MISMATCH do
     begin
       dwSize := dwSize * 2;
       ReallocMem(pPtr, dwSize);
       ntStatus := ZwQuerySystemInformation(ATableType, pPtr, dwSize, nil);
     end;
     if ntStatus = NT_STATUS($00000000){STATUS_SUCCESS} then
       Result := pPtr
     else
       FreeMem(pPtr);
   end;
Когда-то это нарыл в инете. Вроде даже получалось получать список открытых файлов другими процессами, но на практике особо не пригодилось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.11.2012, 16:30   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Просто нет. Типично: перебрать все процессы, просмотреть их открытые файлы и сравнить... естественно, для кучи файлов очень неэффективно.
p51x вне форума Ответить с цитированием
Старый 25.11.2012, 17:00   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от 3StYleR Посмотреть сообщение
Оkay. А просто проверить открыт файл в другом приложении или нет можно?
В принципе можно, только это вам ничего не гарантирует. Пока вы решите перемещать файл его вновь может открыть другой процес.
waleri вне форума Ответить с цитированием
Старый 25.11.2012, 18:27   #9
3StYleR
 
Регистрация: 22.02.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
В принципе можно, только это вам ничего не гарантирует. Пока вы решите перемещать файл его вновь может открыть другой процес.
Мне эта проверка нужна, чтобы знать, когда файл полностью скопировался в нужную директорию. Другие процессы, в принципе, не должны открывать файл после этого
3StYleR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как открыть шаблон Word-a из папки в корневой папки программы :) flouwjke Общие вопросы Delphi 3 30.04.2012 00:25
[BAT] Сканирование папки на предмет exe. Alex Cones Операционные системы общие вопросы 2 09.06.2010 07:36
сканирование папки andrey poki Общие вопросы Delphi 2 26.03.2009 08:20
Сканирование программой папки. Delphi DerSky Помощь студентам 2 21.05.2008 10:52
Администрирование\управление компьютером\Общие папки\Общие ресурсы\прекратить общий доступ lm_strj Безопасность, Шифрование 2 13.10.2007 21:28