Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

высвобождение файла   Найти похожие ветки 

 
lexus3d_(1)   (2005-05-05 08:47) [0]

Вопрос возник неожиданно и незванно, но тем не менее прошу подсказать как можно решить данную проблемму:
- создаю файл (неважно какой просто создаю);затем пытаюсь этот файл зажать при помощи компонента, но перед этим стоит условие на проверку существования файла (файл существует! проверка проходит на ура!) но архив не создаёться поскольку файл то оказываеться занятым моим собственным приложением, так вот как мне освободить файл, что бы вновь на него сослаться!


 
KilkennyCat ©   (2005-05-05 08:54) [1]

как проверяется? после создания есть где-нить closefile() ?


 
lexus3d ©   (2005-05-05 09:00) [2]

конечно .. файл создал поработал с ним и закрыл. я это отдельно в функции вынесь .. мне так нужно ... файл создаёться! я даже прочитать из него могу! А вот удалить не могу, поскольку он занят моим приложение.


 
dmitry501 ©   (2005-05-05 09:41) [3]

lexus3d_(1)   (05.05.05 8:47)
Приведите кусочки из программы где файл создается, закрывается и сжимается...


 
lexus3d ©   (2005-05-05 09:57) [4]

procedure PakToFile(pName: PChar);
      //pFile - путь до файлов которые будут сливаться!
      //fName - имя файла который будет заливаться в общий файл
      //pName - путь/имя файла который должен получиться после сливания
var tFiles,lFile: File;
   fSize,i,j,xSize: integer;
   cCh:array [0..1023] of Byte;//Char;
   NumRead, NumWritten: Integer;
   fName,sName: String;
begin
if  FileExists(pName) then DeleteFile(pName);
for i:=0 to List.Count-1 do
 begin
    fName:=List.Strings[i];

    AssignFile(lFile,pName);
    if not FileExists(pName) then
      ReWrite(lFile,1)
    else
      Reset(lFile,1);

     AssignFile(tFiles,pFile+fName);
     Reset(tFiles,1);

    fSize:=Filesize(lFile);
    if fSize<>0 then  Seek(lFile,fSize);
//------------------------------------------------------------------------------>
    sName:=inttostr(Length(fName));    //опред.длину названия фыйла
    xSize:=byte(Length(sName));        //из скольки символов состоит число "длинны" файла
    sName:=numSize(xSize,sName);       //получаем конечный результат: "001" или "021" или "215"

    for j:=1 to 3 do                                       //записываем размер имени файлы
    BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);

    for j:=1 to length(fName)do                            //записываем имя файла
     BlockWrite(lFile,fName[j],1,NumWritten);
//------------------------------------------------------------------------------>
    fSize:=Filesize(tFiles);                     //определяем размер файла пере-
    sName:=inttostr(Length(IntToStr(fSize)));    //водим его в символьное выра-
    xSize:=byte(Length(sName));                  //жение для записи в конечный
    sName:=numSize(xSize,sName);                 //файл.

    for j:=1 to 3 do
    BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);

    sName:=inttostr(fSize);
    xSize:=Length(sName);
    for j:=1 to xSize do
    BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);
//------------------------------------------------------------------------------>
repeat
    BlockRead(tFiles,cCh,SizeOf(cCh),NumRead);   //сам процесс соединения фалов в один
    BlockWrite(lFile,cCh,NumRead,NumWritten);    //
until (NumRead = 0) or (NumWritten <> NumRead);
    CloseFile(tFiles);
end;
    FileMOde:=0;
    CloseFile(lFile);

end;
.....
//упаковка  идёт через компонент
pZip:=ExtractFilePath(ParamStr(0))+"1.plp";
if  FileExists (pZip) then
begin
Zip1.CreateArchive(Edit1.Text);
Zip1.AddFile(pZip);
Zip1.CloseArchive;
ShowMessage("Скин готов!");
end
else
ShowMessage("Файла для скина не существует!!!");
end;

ну вот вырезки из кода .. procedure"a работает на "ура" проверенно... просто файл к которому я обращаюсь для архивации являеться занятым.


 
alpet ©   (2005-05-05 10:14) [5]

Догадайся что дает строка:

pZip:=ExtractFilePath(ParamStr(0))+"1.plp";

правильный ответ - "program.exe1.plp", где program - имя исполняемого файла твоей проги. Учись использовать отладчик и окно watch - помогает.


 
alpet ©   (2005-05-05 10:15) [6]

хотя нет сейчас сам проверю.


 
lexus3d ©   (2005-05-05 10:21) [7]


> alpet ©   (05.05.05 10:15) [6]
> хотя нет сейчас сам проверю.

вот вот ..проверька ... всё правельно она возвращает!


 
alpet ©   (2005-05-05 10:27) [8]

2 ошибки пока нашел.
1. У меня не вызов  AssignFile(lFile, pName) приводил к исключению, заменил на  AssignFile(lFile, ".\" + pName);
2. Эта самая функция открывает файл несколько раз поскольку находится в теле цикла вместе Reset / ReWrite, тогда как CloseFile вне цикла. Это и дает ошибку доступа к файлу.


 
alpet ©   (2005-05-05 10:29) [9]

Вынес из цикла AssignFile - все заработало, хотя не смотрел как это  повлияло на процесс упаковки.


 
lexus3d ©   (2005-05-05 12:30) [10]

2alpet

большущее спасибо ... сам виноват как раз там и были ошибки, убрал из цикла и всё нормально заработало.

спасибо что ткнул носом ... буду внимательнее!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.056 c
1-1118234930
alexa
2005-06-08 16:48
2005.06.29
Как из dll вызвать функцию основной программы?


14-1117610965
Skier
2005-06-01 11:29
2005.06.29
Построение буферной зоны.


1-1117714328
MilkShape
2005-06-02 16:12
2005.06.29
Помогите разобраться новичку


4-1114793145
Grell
2005-04-29 20:45
2005.06.29
Изменение BorderStyle


3-1115995250
Lex_!
2005-05-13 18:40
2005.06.29
TThread и работа с базой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский