Re: Немогу открыть текстовый файл
От: Serg Bormant  
Дата: 04.03.02 19:32
Оценка: 3 (1)
Здравствуйте DeaDMan_77, Вы писали:

D7>Необходимо открыть файл (впринципе нужен только для чтения), который постоянно обновляется, я так понимаю постоянно занятый другим приложением. Блокнотом открывается, а Делфями никак, пишет что неможет открыт файл.

D7>Так вот, всезнающий All, подскажи как же мне это сделать.

Предположу(1), что под "открывается" имелось в виду Assign(f, filename); Reset(f); (на будущее: нелишне приводить пример неработающего кода-- отвечающему придется меньше домысливать ;) ). В этом случае файл открывается в режиме 2(fmOpenReadWrite or fmShareCompat). Это поведение изменяется путем установки FileMode перед вызовом Reset.

FileMode := $40; (* fmOpenRead or fmShareDenyNone *)

Прим 1: Значение FileMode сбрасывается после Reset.
Прим 2: FileMode объявлена как var, а не threadvar, т.е. не потоко-безопасна.

Если предположение (1) неверно, и имелось в виду FileOpen()-- см. 2-й параметр.

Читать: Delphi Help на тему "FileMode variable", "file open mode constants", "FileOpen function", "TFileStream.Create", ...
--
wbr, sb
--

wbr, sb Правила форумов RSDN, Как правильно задавать вопросы
Немогу открыть текстовый файл
От: DeaDMan_77 Россия citrusnev.com
Дата: 02.03.02 22:14
Оценка:
Необходимо открыть файл (впринципе нужен только для чтения), который постоянно обновляется, я так понимаю постоянно занятый другим приложением. Блокнотом открывается, а Делфями никак, пишет что неможет открыт файл.
Так вот, всезнающий All, подскажи как же мне это сделать.
Да не залипнет у вас Ctrl+Alt+Del
Re[2]: Немогу открыть текстовый файл
От: vav Россия  
Дата: 13.03.02 04:30
Оценка:
а можно сразу CreateFile

она не только создает...
Re[3]: Немогу открыть текстовый файл
От: GeorgeT  
Дата: 13.03.02 08:43
Оценка:
Здравствуйте vav, Вы писали:

vav>а можно сразу CreateFile


vav>она не только создает...


Лучше сразу API функцией CreateFile... Ничего лучше я пока не встречал
Re[4]: Немогу открыть текстовый файл
От: vav Россия  
Дата: 13.03.02 10:02
Оценка:
Здравствуйте GeorgeT, Вы писали:

GT>Здравствуйте vav, Вы писали:


vav>>а можно сразу CreateFile


vav>>она не только создает...


GT>Лучше сразу API функцией CreateFile... Ничего лучше я пока не встречал


А чем твоя лучше моей ? (несчитая CreateFileA и CreateFileW)
Re[5]: Немогу открыть текстовый файл
От: GeorgeT  
Дата: 13.03.02 11:27
Оценка:
Здравствуйте vav, Вы писали:

vav>Здравствуйте GeorgeT, Вы писали:


GT>>Здравствуйте vav, Вы писали:


vav>>>а можно сразу CreateFile


vav>>>она не только создает...


GT>>Лучше сразу API функцией CreateFile... Ничего лучше я пока не встречал


vav>А чем твоя лучше моей ? (несчитая CreateFileA и CreateFileW)


Может и не получиться если это файл открыт другим приложением с FILE_SHARE_READ... тогда ты вообще не сможешь открыть его на чтение
Re[2]: Немогу открыть текстовый файл
От: DeaDMan_77 Россия citrusnev.com
Дата: 13.03.02 15:45
Оценка:
SB>Предположу(1), что под "открывается" имелось в виду Assign(f, filename); Reset(f); (на будущее: нелишне приводить пример неработающего кода-- отвечающему придется меньше домысливать ). В этом случае файл открывается в режиме 2(fmOpenReadWrite or fmShareCompat). Это поведение изменяется путем установки FileMode перед вызовом Reset.


procedure TMainForm.FileOpen1Execute(Sender: TObject);
var f: System.Text;
begin
if OpenDialog.Execute then
begin
CreateMDIChild(OpenDialog.FileName);
AssignFile (f, OpenDialog.FileName);
FileMode := $40;
Reset (f);
end;
end;

Не работает.

Если конкретнее, то необходимо открыть файл http.log, программы winroute.
Да не залипнет у вас Ctrl+Alt+Del
Re[3]: Немогу открыть текстовый файл
От: Аноним  
Дата: 13.03.02 18:33
Оценка:
Здравствуйте DeaDMan_77, Вы писали:

D7>procedure TMainForm.FileOpen1Execute(Sender: TObject);

D7>var f: System.Text;
D7>begin
D7> if OpenDialog.Execute then
D7> begin
D7> CreateMDIChild(OpenDialog.FileName);
D7> AssignFile (f, OpenDialog.FileName);
D7> FileMode := $40;
D7> Reset (f);
D7> end;
D7>end;
D7>Не работает.

При Reset(t:System.Text) System.FileMode вообще не учитывается (d6,system.pas):
4028: OpenMode := GENERIC_READ; // open for read
4042: Temp := CreateFileA(t.Name, OpenMode, FILE_SHARE_READ, nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);


D7>Если конкретнее, то необходимо открыть файл http.log, программы winroute.

Похоже на то, что он открыт монопольно... Его чем-то еще можно открыть?
Re[4]: Немогу открыть текстовый файл
От: DeaDMan_77 Россия citrusnev.com
Дата: 13.03.02 22:22
Оценка:
D7>>procedure TMainForm.FileOpen1Execute(Sender: TObject);
D7>>var f: System.Text;
D7>>begin
D7>> if OpenDialog.Execute then
D7>> begin
D7>> CreateMDIChild(OpenDialog.FileName);
D7>> AssignFile (f, OpenDialog.FileName);
D7>> FileMode := $40;
D7>> Reset (f);
D7>> end;
D7>>end;
D7>>Не работает.

А>При Reset(t:System.Text) System.FileMode вообще не учитывается (d6,system.pas):

А>
А>4028: OpenMode := GENERIC_READ; // open for read
А>4042: Temp := CreateFileA(t.Name, OpenMode, FILE_SHARE_READ, nil, Flags, FILE_ATTRIBUTE_NORMAL, 0);
А>


D7>>Если конкретнее, то необходимо открыть файл http.log, программы winroute.

А>Похоже на то, что он открыт монопольно... Его чем-то еще можно открыть?

Можно, темже блокнотом.

Если можно, кинте полный код, а то я что-то по ламерству своему непонял что к чему
С API никогда не работал.
Да не залипнет у вас Ctrl+Alt+Del
Re[5]: Немогу открыть текстовый файл
От: vav Россия  
Дата: 14.03.02 04:38
Оценка:
Здравствуйте DeaDMan_77, Вы писали:

D7>Если можно, кинте полный код, а то я что-то по ламерству своему непонял что к чему :(

D7>С API никогда не работал.

напиши CreateFile и нажми F1. Откроется соответствующая справка:

HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
с детальным описанием какой параметр для чего нужен.

Uses ShellAPI;
...
var
h:HANDLE;
...

CreateFile(
PChar(PathToYourFileWithBackslash+FileName),
GENERIC_READ,
FILE_SHARE_READ,
Nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);

if INVALID_HANDLE_VALUE = h then showmessage('Error opening file...')
else showmessage('File opened successfuly.');

для чтения используй ReadFile — получение справки аналогично.


--
и почему тут нет тегов "текст программы на Дельфи"?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.