Сейчас на форуме: user99, _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых) |
![]() |
eXeL@B —› Основной форум —› Доступ к файлу |
Посл.ответ | Сообщение |
|
Создано: 15 октября 2005 11:40 · Личное сообщение · #1 |
|
Создано: 15 октября 2005 12:49 · Личное сообщение · #2 Если файл открыть на шару, то его можно изменять. Поэтому достаточно в проге изменить права на открытие файла (FILE_SHARE_READ | FILE_SHARE_WRITE). Смотри функцию CreateFile. Проблема может быть тогда, когда прога использует что-то типа CFile, ведь вызов уйдёт глубоко в библиотеку. Но и в таком случаи достаточно добавить константу CFile::shareDenyNone. ![]() |
|
Создано: 15 октября 2005 13:03 · Личное сообщение · #3 |
|
Создано: 15 октября 2005 13:25 · Личное сообщение · #4 |
|
Создано: 15 октября 2005 14:32 · Личное сообщение · #5 |
|
Создано: 15 октября 2005 15:23 · Личное сообщение · #6 |
|
Создано: 15 октября 2005 19:01 · Личное сообщение · #7 Windows блокирует ПОЛНЫЙ доступ ко многим файлам, которые в данный момент использует система. К таким файлам относятся выполняемые программы, используемые библиотеки, шрифты и т.д. При поиске вирусов, к примеру, эти файлы представляют наибольший интерес. Обдурить Windows и получить доступ к этим файлам крайне просто - нужно открывать их в режиме ReadOnly. В Delphi за режим открытия файлов отвечает системная переменная FileMode. Boзможные значения: 0 Read only 1 Write only 2 Read/Write По умолчанию FileMode==2, поэтому открытие заблокированых файлов нарывается на неприятность. При доступе ReadOnly доступ блокируется только д так что этот случай приходится контролировать отдельно. В общем случае, если Вы хотите лазить по всем файлам подряд - применима следующая последовательность действий. program pfileMode; {$APPTYPE CONSOLE} uses SysUtils; var oldFM: integer; var SR: TSearchRec; begin if FindFirst('C:\*.*', faAnyFile, SR) = 0 then repeat try oldFM := FileMode; FileMode := 0; WriteLn(SR.Name); //работаем с файлом finally FileMode := oldFM; end; until FindNext(SR) < > 0; FindClose(SR); readLn; end. ----- M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240 ![]() |
|
Создано: 16 октября 2005 00:50 · Личное сообщение · #8 |
|
Создано: 16 октября 2005 02:05 · Поправил: ZLOFENIX · Личное сообщение · #9 Попробовал вот что получилось: program pfileMode; {$APPTYPE CONSOLE} uses SysUtils; var FromF, ToF: file; NumRead, NumWritten: Integer; Buf: array[1..2048] of Char; oldfm:integer; begin oldfm:=filemode; filemode:=0; AssignFile(FromF, 'xxx.fgh'); Reset(FromF, 1); { Record size = 1 } AssignFile(ToF, 'original.fgh'); Rewrite(ToF, 1); { Record size = 1 } repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); filemode:=oldfm; CloseFile(FromF); CloseFile(ToF); end. НЕСРАБОТАЛО или я кривой ? т.к. я незнаю как переписать файл через Write/Read списал через BlockWrite/BlockRead или еще как то можно переписать чтобы это все работало ? НЕ ИЗМЕНЯЯ EXE ! ![]() |
|
Создано: 16 октября 2005 04:26 · Поправил: cbs · Личное сообщение · #10 |
|
Создано: 16 октября 2005 05:00 · Личное сообщение · #11 |
|
Создано: 16 октября 2005 12:50 · Личное сообщение · #12 В ольке bp CreateFile, выходишь из процедуры. Если оказываешься в файле(а не MFC библиотеке), то должен будешь увидеть что-то типа этого: push 0 ;цифры могут быть разными push 80 push 3 push 0 push 1 ;вот тут и надо править push 80000000 push eax call CreateFileA ... ;ты тут А вот если окажешься в MFC библиотеке, то нажимаешь Debug->Execute till user code и смотришь номер той функции которая была вызвана. С ней и надо будет разбираться. ![]() |
![]() |
eXeL@B —› Основной форум —› Доступ к файлу |