Inversarea ordinii fisierelor intr-un folder

Diverse limbaje, programare, scripting, coduri, unelte specifice etc.
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Inversarea ordinii fisierelor intr-un folder

Mesaj de Manu »

De curand am scanat din greseala o carte de la sfarsit la inceput cu scanerul de la club.
Pentru ca era o munca de chinez sa inversez manual ordinea fisierelor, am scris cateva randuri de cod care face aceasta treaba automat, 300 de fisiere dureaza in jur de 20 secunde la calculatorul meu, dimensiunea totala a celor 300 de fisiere fiind de aproximativ un giga, probabil ca fisierele mai mici vor fi inversate si mai repede.
Poate fi util si in ideea ca merge cineva sa scaneze si nu are pe cine sa intrebe care e inceputul cartii, poate scana linistit oricum si apoi inversa usor daca e cazul.

Daca i se mai intampla cuiva, fisierul de la linkul urmator rezolva treaba.
Trebuie doar pus fisierul in folderul cu pozele, apoi dat enter pe el, apoi sunt doua input box-uri care intreaba:
1. extensia fisierelor care se doresc inversate,
2. Directorul in care sa fie puse fisierele in ordine inversa. Directorul va fi creat in folderul in care este fisierul EXE si pozele sau orice alte fisiere de rearanjat.
Fisierele vor fi denumite sub forma:
0001.extensie
0002.extensie
.....
0010.extensie
0011.extensie
.....
0100.extensie
0101.extensie
.....
1000.extensie
1001.extensie
.....

Executabil pentru sortarea inversa a fisierelor dintr-un folder

Am scris codul in BGT, pun mai jos si sursa daca vrea cineva un exemplu. Codul este comentat, mai putin loopul care contine algoritmul de inversare, acesta putand fi inteles daca e cineva care se mai joaca cu programarea. De asemenea codul poate fi usor portat in alt limbaj, avand in vedere ca BGT nu este un limbaj general purpose.

Cod: Selectaţi tot

void main()
{
// cream o fereastra valabila pe durata procesului:
show_game_window("Inversare fişiere");

// intrebam extensia fisierelor de gasit care va fi scrisa fara punct in fata:
string extension=input_box("Extensia", "Scrieţi extensia fişierelor de inversat fără punct:");

// o variabila care va tine continutul unui fisier pana acesta va fi pus in fisierul nou:
string temp="";

// pentru a denumi cu un numar de zerouri in fata astfel incat sa fie o ordonare alfabetica, cream o variabila care va fi ajustata in functie de numarul fisierului::
string prefix="";

// umplem un array cu toate fisierele gasite in folderul curent cu extensia scrisa:
string[] all_files=find_files("*."+extension);

// verificari daca e scrisa vreo extensie sau a fost gasit vreun fisier:
// daca nu s-a scris nimic la extensie:
if(extension=="")
{
alert("Eroare!", "Nu a fost scrisă o extensie.");
exit();
}

// daca nu e gasit nici un fisier:
if(all_files.length==0)
{
alert("Eroare!", "Nu au fost gasite fişiere cu extensia "+extension+".");
exit();
}

// intrebam numele directorului in care vor fi rearanjate fisierele:
string directory_name=input_box("Creare folder", "Scrieţi numele directorului în care să fie salvate fişierele în ordine inversă:");

// daca nu e scris nimic la folder, il denumim inversate:
if(directory_name=="") directory_name="Inversate";

// cream directorul:
directory_create(directory_name);

// cream un cronometru pentru a vedea cat a durat rearanjarea:
timer t;

// un for care va lua fiecare fisier in parte dupa un algoritm si il va muta in folderul creat cu numarul corespunzator:
for(int i=all_files.length()-1; i>=0; i--)
{
file f;
f.open(all_files[i], "rb");
temp=f.read(0);
f.close();

wait(5);

int j=all_files.length()-i;

// calcularea prefixului:
if(j<10) prefix="000";
else if(j>=10&&j<100) prefix="00";
else if(j>=100&&j<1000) prefix="0";
else prefix="";
// sfarsit calculare prefix.

file g;
g.open(directory_name+"//"+prefix+j+"."+extension, "wb");
g.write(temp);
g.close();
} // end for.

// un alert care anunta:
alert("Succes!", "Procesul a durat "+t.elapsed+" milisecunde.");
exit();
}
Ultima oară modificat 30 Dec 2011, 01:50 de către Manu, modificat 1 dată în total.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
IonPop
Colonel
Mesaje: 2166
Membru din: 02 Oct 2010, 17:55

Re: Inversarea ordinii fisierelor intr-un folder

Mesaj de IonPop »

Probabil ca ar fi mai eficient sa scri un cod care doar sa redenumeasca fisierele in loc sa le copieze, fiindca ar dura doar o fractiune de secunda si nici nu s-ar ocupa mai mult spatiu pe hard disk, caci banuiesc ca nu mai ai nevoie de fisierele in ordinea gresita.
Am scris ca un exemplu programul de mai jos in Perl, in care extensia fisierelor se poate specifica in linia de comanda. Este doar un exemplu asa ca nu am scris un cod care sa preia extensia dintr-un dialog cu un camp de editare:

use File::Slurp;

die "Trebuie specificata extensia ca prim parametru" unless $ARGV[0];

my @files = read_dir( '.' );
@files = grep { /\.$ARGV[0]$/i } @files;
my @reverse_files = reverse @files;

rename( $files[$_], "$files[$_].temp" ) for 0 .. $#files;
rename( "$files[$_].temp", $reverse_files[$_] ) for 0 .. $#files;
Campus
Comandantul unitatii
Mesaje: 446
Membru din: 09 Mai 2007, 12:15
Localitate: Cluj Napoca

Mesaj de Campus »

Pun si eu codul in autoit cu toate brizbrizurile aferente
Pentru interesati se poate compila intr-un programel :P

Cod: Selectaţi tot

#Include <File.au3>
#Include <Array.au3>
; Alegem folder-ul din casuta de dialog
$dir=FileSelectFolder("Alege directorul cu fisiere","")
; Alegem extensia (aici implicit e gif)
$ext=InputBox("Scrieti extensia","Scrieti extensia fara punct a fisierelor ce doriti sa fie procesate!", "gif")
; Incarcam fisierele intr-un sir
$data=_FileListToArray($dir,"*"&$ext)
; Aflam numarul de fisiere si il stocam intr-o variabila
$nrFisiere=_ArrayDelete($data,0)
; stocam sirul original de fisiere
$originale=$data
; inversam sirul de fisiere
_ArrayReverse($data)
; cream un director temporar in directorul actual
DirCreate($dir&"\temp")
; redenumim fiecare fisier in directorul temporar cu numele celui din sirul inversat
for $x=0 to $nrFisiere-1
	FileMove($dir&"\"&$originale[$x],$dir&"\temp\"&$data[$x])
Next
; redenumim fiecare fisier din directorul temporar inapoi in directorul actual
for $x=0 to $nrFisiere-1
	FileMove($dir&"\temp\"&$data[$x],$dir&"\"&$data[$x])
Next
; stergem directorul temporar
DirRemove($dir&"\temp")
; afisam un mesaj pentru a confirma terminarea scriptului
MsgBox(64,"Succes!","Au fost redenumite "&$nrFisiere&" fisiere"&@CRLF&"La revedere!")
Exit
Sper sa fie de folos cuiva!
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Re: Inversarea ordinii fisierelor intr-un folder

Mesaj de Manu »

IonPop scrie:Probabil ca ar fi mai eficient sa scri un cod care doar sa redenumeasca fisierele in loc sa le copieze, fiindca ar dura doar o fractiune de secunda si nici nu s-ar ocupa mai mult spatiu pe hard disk, caci banuiesc ca nu mai ai nevoie de fisierele in ordinea gresita.
Nu se stie, poate mai e nevoie.
Intr-adevar, un rename ar fi cel mai bun, dar eu am facut in BGT si nu am functie pentru asa ceva.
De curiozitate, ce s-ar intampla totusi daca eu le am in acelasi fel denumite pe cele de care nu mai am nevoie, iar 300 ar trebui sa devina 1, iar 1 sa devina 300?
Campus scrie:Pun si eu codul in autoit cu toate brizbrizurile aferente
Pentru interesati se poate compila intr-un programel
Pai sigur va fi util daca o sa fie inclus in pachetul la care lucrezi... :)
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
IonPop
Colonel
Mesaje: 2166
Membru din: 02 Oct 2010, 17:55

Re: Inversarea ordinii fisierelor intr-un folder

Mesaj de IonPop »

Din cate am vazut in programul lui Campus, exista functia FileMove, care este exact functia rename din Perl. Cu siguranta ca FileMove poate "muta" un fisier dintr-un director in acelasi director, dar sub o alta denumire, ceea ce inseamna ca de fapt pur si simplu redenumeste fisierul.

Iar atunci nu mai trebuie creat directorul temporar ca la sfarsit sa trebuiasca sa fie sters.

In programul pe care l-am facut eu, am facut doua redenumiri, una in care am adaugat ".temp" la numele fiecarui fisier, iar a doua in care am redenumit fiecare fisier astfel incat sa nu mai aiba extensia .temp si sa fie in ordine inversa.
In acest mod nu apare problema inlocuirii fisierului 1 cu 300 in momentul in care fisierul 300 exista inca.
Cornel
Locotenent
Mesaje: 376
Membru din: 02 Iun 2008, 23:17
Localitate: Targu Frumos

inversare?

Mesaj de Cornel »

in abbyyfine este renumber pages. Nu ar fi mai lejer sa se apeleze la functia asta?
Cornel
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Am vazut si eu optiunea, dar nu am avut rabdare sa vad cum functioneaza, aproape ca a fost mai usor sa fac programelul ala.
Cand am vazut ca ma intreaba nu stiu ce cu First selected page si ce stiu mai ce... am zis ca e mai simplu sa fac un mic exercitiu.
Desigur insa ca daca acea optiune din Abby inverseaza paginile... e cea mai simpla varianta. Tu ai reusit sa inversezi? Cam cum functioneaza ca erau ceva radio butoane pe care JAWS nu le citea la prima vedere tocmai bine.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Cornel
Locotenent
Mesaje: 376
Membru din: 02 Iun 2008, 23:17
Localitate: Targu Frumos

renumber

Mesaj de Cornel »

am incercat pe trei pagini; daca pagina unu de exemplu o renumerotez cu doi, automat pagina doi devine trei respectiv trei unu; asadar, se renumeroteaza in functie de pagina pe care am schimbat-o, si restul paginilor in mod succesiv; in mod cert, daca 1 as numerota-o cu 300, toate paginile ar face un salt de pozitii in mod succesiv. oricum, ar trebui sa incerce cineva pe mai multe pagini. Intr-adevar, nu stiu de ce nu merg acele radiobutoane, dar renumerotarea se poate face fara probleme.
Cornel
GruiaVelicu
Locotenent - colonel
Mesaje: 1063
Membru din: 15 Mar 2008, 15:50
Localitate: Cluj-Napoca

Mesaj de GruiaVelicu »

Problema nu e renumerotarea, ci faptul ca pagina 10 sa devină 1, 2 - 9, 8 - 3 etc. Chestia devine utila cand s-a scanat o carte invers.
Gruia
Cornel
Locotenent
Mesaje: 376
Membru din: 02 Iun 2008, 23:17
Localitate: Targu Frumos

renumerotare

Mesaj de Cornel »

pai si noi despre ce discutam acilea?
Cornel
GruiaVelicu
Locotenent - colonel
Mesaje: 1063
Membru din: 15 Mar 2008, 15:50
Localitate: Cluj-Napoca

Mesaj de GruiaVelicu »

Pai si cum faci cu renumerotarea din Abby? Sa zicem ca ai o carte de 300 de pagini. Cum faci?
Gruia
GruiaVelicu
Locotenent - colonel
Mesaje: 1063
Membru din: 15 Mar 2008, 15:50
Localitate: Cluj-Napoca

Mesaj de GruiaVelicu »

Pai acea obtiune doar renumeroteaza, nu inverseaza. Adică o carte de la 1 la 300 devine de la 301 la 600.
Gruia
Scrie răspuns