PDA

Показать полную графическую версию : Почему программе не получается считать из файла данные,записанные туда др.программой?


Nayan
17-01-2011, 18:41
одна программа(назовем ее прога 1), написанная на делфи пишет в файл "ФИО.тхт" данные, не получается считать(и записать туда) из этого файла инфу прогой 2(написана на с++), пока не выйдешь из проги 1.

lxa85
17-01-2011, 19:02
Nayan, после чтения/записи или иной работы с фалом, его надо закрывать. Желательно сразу после окончания работы, а не в конце программы.
Так же возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ним.

Nayan
17-01-2011, 19:13
Да, конечно его закрываю после записи прогой 1 и до обращения второй проги к файлу.
возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ним. » ------- а как это выглядит на практике и как избавиться от этой проблемы?

Beyound
17-01-2011, 21:17
Виндос и любая другая ос без процесса, занявшего файл, никак его не блокирует.
Так что ищите что это за процесс, который занял этот файл. Проверьте - точно ли файл отпускается "программой 1". Попробуйте так - запустите "программу 1" и перед запуском "программы 2" убейте первую руками чтоб следов от нее не осталось. Если файл останется занят, бум думать.. но это врятли.

возможно это влияния работы файловой подсистемы, когда при открытии файла одной программой, другой запрещается работать с ни »
это выглядет как у вас - "программа 1" открыла файл для операций с ним и нет ключа на совместное исп-ие файла (в .net такое вроде есть) или не закрыла работу с ним. До тех пор пока работа не закроется ни одна другая программ, скажем блокнот, его не откроет.

Delirium
18-01-2011, 00:52
Скачиваем программу Unlocker (http://soft.softodrom.ru/ap/Unlocker-Portable-p6411) , а правым щелчком на заблокированном файле - Unlocker - он покажет, что блокирует файл. В любом случае проблемы из за монопольного доступа "проги_1" к файлу. Создателю надо было не брать файл в монопольный доступ для прочтения данных.

Nayan
24-01-2011, 16:50
Это прога 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-го приложения из другого?

Beyound
24-01-2011, 19:07
ну я даже незнаю что тебе в таком случае посоветовать... скажем... попробуй подождать пока ты не получишь доступ к файлу. Сделать это легко: ф-ию открытия файла помести в try catch блок и все это в цикл до тех пор, пока не откроется файл. Но опять-же - тогда ты просто дождешься лазейки (если она будет) и отберешь файл у зазевавшейся программы, как она отреагирует на такую наглость - как программист написал. варварство конечно.. но может прокатить.

Nayan
04-05-2011, 08:53
опять проблема в связке этих 2 программ. В ХР более менее работает. А вот в вин7 выходит ошибка аксес виолейшн(скрин окна ошибки прикреплен). При этом замечено, что при запуске пользователем такой ошибки нет, а при вызове из другой программы (winexec'ом) есть.
http://forum.oszone.net/attachment.php?attachmentid=63628&d=1304484483
блин как загнать картинку в спойлер?

Любезный
04-05-2011, 20:31
Вместо устаревшей WinExec используй ShellExecute. Детали - в справке или в гугле.




© OSzone.net 2001-2012