napisałem program do archiwizowania plików *.txt który działa na nast. zasadzie "Podczas archiwizacji program wyszykuje wszystkie pliki i foldery w danej lokalizacji. Wyniki, w postaci linków są zapisywane w tymczasowym pliku. Następnie po kolei odczytywane są linki z pliku tymczasowego. Po wczytaniu linka, link jest kopiowany razem z zawartością wskazanego pliku do archiwum tar. " I podczas korzystania z programu między partycjami tzn pliki tekstowe są na jednej partycji, a na innej chce stworzyć archiwum, program wykonuje dziwną operacje. Mianowicie program wczytuje link z pliku tymczasowego następnie (i nie wiem dlaczego) zmienia literę dysku i ucina w ścieżce jeden folder. wygląda to tak:
plik tymczasowy
d:\1\Dane testowe\
d:\1\Dane testowe\df.txt
768
d:\1\Dane testowe\3\
d:\1\Dane testowe\3\1rohtefkjhsayfrwiyfihjsdgyhqwcoecfhsjhdgqwhrfiehsjdvtiuqhdsg.txt
67
d:\1\Dane testowe\3\2\
d:\1\Dane testowe\3\2\2.txt
archiwum
d:\1\
d:\1\Dane testowe\
d:\1\Dane testowe\df.txt
768
c:\3\
c:\3\1rohtefkjhsayfrwiyfihjsdgyhqwcoecfhsjhdgqwhrfiehsjdvtiuqhdsghoperyfpsdjdddjs.txt
jakies dane
c:\3\2\
c:\3\2\2.txt
jakies dane
jak wpisałem komendę, żeby mi wypisywał na ekranie te ścieżki na ekranie to wypisuje poprawne ścieżki. Dopiero w momencie zapisu coś mu odbija. Problem w tym, że nie wiem co... ;(
oto kod źródłowy (kompiluje się pod dev-pascalem):
program archiwizator;
uses
Crt, SysUtils, Dos;
const
maska: string = '*.*';
var
plik_tym, n_fol_gl, nazwa_pliku, sciezka, buff, linia: string;
objetosc: extended;
licznik, licznik2: integer;
wybor: byte;
plikwej, rek, tymczasowy: Textfile;
znak: char;
procedure szukanie;
var
sr: SearchRec;
begin
FindFirst(maska, ($01 and $02 and $04 and $08 and $20), sr);
while DosError = 0 do
begin
writeln(tymczasowy, ExpandFileName(sr.Name));
objetosc:=objetosc + sr.size;
writeln(tymczasowy, sr.size);
inc(licznik);
FindNext(sr);
end;
FindFirst(maska, $3F, sr);
while DosError = 0 do
begin
if (SR.Attr and $10 <> 0) and (SR.Name <> '.') and (SR.Name <> '..') then
begin
writeln(tymczasowy, ExpandFileName(sr.Name)+'\');
ChDir(SR.Name);
szukanie;
ChDir('..');
end;
FindNext(SR);
end;
FindClose(sr);
end;
function DirectoryExists(Sciezka : string) : Boolean;
var SR : SearchRec;
begin
DirectoryExists := False;
FindFirst(Sciezka,Directory,SR);
if DosError = 0 then
DirectoryExists := True;
end;
procedure MakeDir(Dir: String);
function Last(What: String; Where: String): Integer;
var
Ind : Integer;
begin
Result := 0;
for Ind := (Length(Where)-Length(What)+1) downto 1 do
if Copy(Where, Ind, Length(What)) = What then begin
Result := Ind;
Break;
end;
end;
var
PrevDir : String;
Ind : Integer;
begin
if Copy(Dir,2,1) <> ':' then
if Copy(Dir,3,1) <> '\' then
if Copy(Dir,1,1) = '\' then
Dir := 'C:'+Dir
else
Dir := 'C:\'+Dir
else
Dir := 'C:'+Dir;
if not DirectoryExists(Dir) then begin
// if directory don't exist, get name of the previous directory
Ind := Last('\', Dir); // Position of the last '\'
PrevDir := Copy(Dir, 1, Ind-1); // Previous directory
// if previous directoy don't exist,
// it's passed to this procedure - this is recursively...
if not DirectoryExists(PrevDir) then
MakeDir(PrevDir);
// In thats point, the previous directory must be exist.
// So, the actual directory (in "Dir" variable) will be created.
CreateDir(Dir);
end;
end;
procedure spr_folder;
begin
if not DirectoryExists(n_fol_gl) then
repeat
writeln('Podany katalog nie istnieje, wpisz poprawna nazwe.');
readln(n_fol_gl);
until DirectoryExists(n_fol_gl);
end;
procedure tw_pliku;
begin
repeat
ClrScr;
writeln('Podaj sciezke i nazwe pliku(koniecznie z rozszerzeniem tar) w ktorym zostana zapisane pliki. ');
readln(nazwa_pliku);
until nazwa_pliku <> '';
if not FileExists(nazwa_pliku) then
begin
assign(rek, nazwa_pliku);
plik_tym:= nazwa_pliku+'.temptar';
assign(tymczasowy, plik_tym);
end
else
begin
writeln('Plik o nazwie ', nazwa_pliku, ' juz istnieje. Wcisnij ENTER, zeby kontynuowac');
readln;
tw_pliku;
end;
end;
procedure od_pliku;
begin
repeat
ClrScr;
writeln('Podaj nazwe lub sciezke do pliku tar.');
readln(nazwa_pliku);
until nazwa_pliku <> '';
if FileExists(nazwa_pliku) then
begin
assign(rek, nazwa_pliku);
reset(rek);
end
else
begin
writeln('Plik o nazwie ', nazwa_pliku, ' nie istnieje. Wcisnij ENTER, zeby kontynuowac.');
readln;
od_pliku;
end
end;
procedure pakowanie;
begin
writeln('Podaj sciezke do folderu z ktorego pliki maja byc zarchiwizowane');
readln(n_fol_gl);
spr_folder;
SetCurrentDir(n_fol_gl);
ClrScr;
tw_pliku;
ReWrite(tymczasowy);
szukanie;
CloseFile(tymczasowy);
if (objetosc > DiskFree(0)) then
begin
writeln('Za malo wolnego miejsca na dysku . Program konczy dzialanie');
readln;
exit;
end
else
begin
Reset(tymczasowy);
Rewrite(rek);
writeln(rek, n_fol_gl+'\');
writeln(rek);
repeat
readln(tymczasowy, sciezka);
if not ((FileGetAttr(sciezka) and Directory) = Directory) then
begin
AssignFile(plikwej, sciezka);
readln(tymczasowy, linia);
//writeln('plik: ', sciezka, ' linia:', linia);
writeln(rek, sciezka);
writeln(rek, linia);
writeln('plik: ', sciezka, ' linia:', linia);
Reset(plikwej);
inc(licznik2);
writeln('Spakowano ',licznik2,'/',licznik,' plikow');
repeat
readln(plikwej, buff);
writeln(rek, buff);
until eof(plikwej);
writeln(rek, #03);
CloseFile(plikwej);
end
else
writeln(rek, sciezka);
//writeln('Folder: ', sciezka);
writeln(rek);
writeln('Folder: ', sciezka);
until eof(tymczasowy);
CloseFile(tymczasowy);
//DeleteFile(tymczasowy);
end;
writeln('Spakowano wszystkie pliki');
readln;
end;
procedure rozpakowanie;
begin
licznik:=0;
licznik2:=0;
writeln('Podaj sciezke do pliku tar');
od_pliku;
repeat
readln(rek, sciezka);
//writeln('sciezka:',sciezka);
readln(rek, linia);
//writeln('linia:',linia);
if length(linia)=0 then
begin
MakeDir(sciezka);
end
else
begin
AssignFile(plikwej, sciezka);
ReWrite(plikwej);
licznik:=StrToInt(linia);
repeat
read(rek, znak);
if znak=#03 then break;
write(plikwej, znak);
until znak=#03;
CloseFile(plikwej);
end;
until eof(rek);
CloseFile(rek);
writeln('Wypakowano wszystkie pliki');
end;
begin
licznik:=0;
licznik2:=0;
objetosc:=0;
writeln('Wybierz opcje');
writeln('1. Archiwizowanie');
writeln('2. Rozpakowanie');
readln(wybor);
if wybor=1 then
pakowanie;
if wybor=2 then
rozpakowanie;
readln;
end.