Почему программе не получается считать из файла данные,записанные туда др.программой?
одна программа(назовем ее прога 1), написанная на делфи пишет в файл "ФИО.тхт" данные, не получается считать(и записать туда) из этого файла инфу прогой 2(написана на с++), пока не выйдешь из проги 1.
|
Nayan, после чтения/записи или иной работы с фалом, его надо закрывать. Желательно сразу после окончания работы, а не в конце программы.
Так же возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ним.
|
Да, конечно его закрываю после записи прогой 1 и до обращения второй проги к файлу.
Цитата:
Цитата lxa85
возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ним. »
|
------- а как это выглядит на практике и как избавиться от этой проблемы?
|
Виндос и любая другая ос без процесса, занявшего файл, никак его не блокирует.
Так что ищите что это за процесс, который занял этот файл. Проверьте - точно ли файл отпускается "программой 1". Попробуйте так - запустите "программу 1" и перед запуском "программы 2" убейте первую руками чтоб следов от нее не осталось. Если файл останется занят, бум думать.. но это врятли.
Цитата:
Цитата Nayan
возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ни »
|
это выглядет как у вас - "программа 1" открыла файл для операций с ним и нет ключа на совместное исп-ие файла (в .net такое вроде есть) или не закрыла работу с ним. До тех пор пока работа не закроется ни одна другая программ, скажем блокнот, его не откроет.
|
Скачиваем программу Unlocker , а правым щелчком на заблокированном файле - Unlocker - он покажет, что блокирует файл. В любом случае проблемы из за монопольного доступа "проги_1" к файлу. Создателю надо было не брать файл в монопольный доступ для прочтения данных.
|
Это прога 2 (С++ Builder 2009), при создании формы происходит:
Код:
ampmax=fopen("AMPLITUDE.txt","r+t");
fio=fopen("fio.txt","r+t");
do
{
fscanf(fio,"%s",&str3);
if (feof(fio)) break;
}
while(true);
for(j=0;j<6;j++)
{
fscanf(ampmax,"%s",&stramp);
strA=strA+" "+stramp;
maximum[j]=atoi(stramp);
}
Label6->Caption=strA;
Label5->Caption=str3;
fclose(fio);
fclose(ampmax);
при этом есть такая особенность, если я запускаю сам (то бишь нахожу ехе-файл проги2 и кликаю по нему), то прога 2 запускается, данные из файла читает. В случае запуска через WinExec прогой1(делфи7) выдает ошибку. Вот участок кода который запускает прогу2 из проги1:
Код:
procedure TMainForm.N1Click(Sender: TObject);
begin
if (ADC_Path <> '') then
WinExec(PChar(ADC_Path), SW_ShowNormal)
else
Application.MessageBox('Не указано распололожение утилиты АЦП', 'Ошибка', MB_OK);
end;
Подскажите плз решение проблемы,что неправильно или вообще может использовать другие ф-ии считывания или запуска 1-го приложения из другого?
|
ну я даже незнаю что тебе в таком случае посоветовать... скажем... попробуй подождать пока ты не получишь доступ к файлу. Сделать это легко: ф-ию открытия файла помести в try catch блок и все это в цикл до тех пор, пока не откроется файл. Но опять-же - тогда ты просто дождешься лазейки (если она будет) и отберешь файл у зазевавшейся программы, как она отреагирует на такую наглость - как программист написал. варварство конечно.. но может прокатить.
|
Вложений: 1
опять проблема в связке этих 2 программ. В ХР более менее работает. А вот в вин7 выходит ошибка аксес виолейшн(скрин окна ошибки прикреплен). При этом замечено, что при запуске пользователем такой ошибки нет, а при вызове из другой программы (winexec'ом) есть.
блин как загнать картинку в спойлер?
|
Вместо устаревшей WinExec используй ShellExecute. Детали - в справке или в гугле.
|
Время: 09:29.
© OSzone.net 2001-