Jump to content


Forumul s-a mutat!

Aceasta este arhiva forumului MacForum.ro din perioada 2010-2014.
Noul forum poate fi accesat aici.
Conturile vechi nu mai sunt valabile pe noul forum!

Photo

Objective-C


  • Please log in to reply
14 replies to this topic

#1 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 26 March 2010 - 14:40

Am o formulă în Objective-C care am făcut-o în așa fel încât să șteargă un dosar sau fișier dintr-o locație exactă pe care i-am sugerat-o. În continuare așa vrea, ca păstrând apoximativ aceeași formulă, aceeași achemă a codului meu, să șteargă dosarul sau fișierul dorit din orice locație unde acesta se află în Mac-ul meu.

Codul de mai jos șterge dosarul ro.lproj din aplicația Calculator. Cum așa putea să fac în așa fel încât dosarul ro.lproj să fie șters din orice loc în care acesta se află?





- (IBAction)move:(id)sender

{

NSString * name = @"ro.lproj";

NSArray * files = [NSArray arrayWithObject: name];



NSWorkspace * ws = [NSWorkspace sharedWorkspace];



[ws performFileOperation: NSWorkspaceMoveOperation

source: @"/Applications/Calculator.app/Contents/Resources/"

destination: @"/Users/HoME/.Trash/"

files: files

tag: 0];

}





#2 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 26 March 2010 - 15:55

De exemplu asa - dar atentie sterge, nu muta in Trash:

dirToRemove - numele directoarelor ce vor fi sterse impreuna cu continutul lor.
fpath - numele directorului in care se face stergerea.

        NSString * fpath = @"/Users/diciu/Desktop/tt";
        NSString * dirToRemove = @"tt";

        NSFileManager * fm  = [NSFileManager defaultManager];
        NSDirectoryEnumerator * de = [fm enumeratorAtPath:fpath];

        NSString *file;
        while (file = [de nextObject])
        {
                BOOL isDir;
                NSString * apath = [NSString stringWithFormat:@"%@/%@", fpath, file];
                if(([fm fileExistsAtPath:apath isDirectory:&isDir] && isDir) && ([[file lastPathComponent] isEqualToString:dirToRemove]))
                {
                        NSError * err = nil;
                        if(![fm removeItemAtPath:apath error:&err])
                                NSLog(@"Failed to remove: %@", apath);
                        else
                                NSLog(@"Removed %@", apath);
                }
        }


#3 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 26 March 2010 - 16:11

DA! Așa e, NSFileManeger nu mută în Trash, motiv pentru care am ales NSWorkspace.

Adică vrei să spui că va trebui pentru fiecare locație, de unde vreau să șterg, sa îi sugerez calea în parte la 'dirToRemove' și 'fpath' ???

#4 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 26 March 2010 - 16:36

0/ Ai mare grija ce faci cu stersul de fisiere recursiv din programare - un bug mic si ti-ai troznit sistemul - ai backup la zi?

1/ NSFileManager muta si el:

- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error

Oricum daca muti mai multe ro.lproj in Trash nu vei mai putea face diferenta intre ele.

2/ Poti sa-i dai un singur path ("/") pentru ca el itereaza prin tot continutul directorului dar solutia este cel putin bizara.

Tu vrei sa stergi ro.lproj de pe tot discul?
Daca da, sunt alte solutii mult mai bune decat ObjC - e.g. script-uri bash (find / -name "ro.lproj" -type d...).

#5 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 26 March 2010 - 17:03

Voi reface acest post..din cauza problemelor de formatare de pe forum.

Edited by Tudor Vedeanu, 26 March 2010 - 21:17.
Am curățat tagurile HTML


#6 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 26 March 2010 - 17:10

0/ Ai mare grija ce faci cu stersul de fisiere recursiv din programare - un bug mic si ti-ai troznit sistemul - ai backup la zi?


Nu e la zi... dar nu măapuc de acțiune până nu șitu exact ceea ce fac. webkit-fake-url://CB4DDA84-87B4-4D73-9216-4DAAACA1FEB9/wink.gif

1/ NSFileManager muta si el:

- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error


Și cum ai scrie asta sub formă de cod/formulă? Așa cum ai dat în exemplul de mai sus. Eu nu am reușit.

2/ Poti sa-i dai un singur path ("/") pentru ca el itereaza prin tot continutul directorului dar solutia este cel putin bizara.


Și e m-am gândit la asta. Vroiam să pun la sursă '/*'. Unde crede-am că va caută în tot HDD-ul. Dar nu am încercat încă. Crezând că e bizar.

Tu vrei sa stergi ro.lproj de pe tot discul?


Într-o oare care măsură, da. Mai exact de acolo unde este instalat ro.lproj.




Daca da, sunt alte solutii mult mai bune decat ObjC - e.g. script-uri bash (find / -name "ro.lproj" -type d...).





Știu. că în Terminal.app >

1. (șterge un dosar sau fișier de pe tot HDD-ul, chiar și din .pkg sau .mpkg dar nu din .zip sau .dmg, în cazul nostru ro.lproj)




sudo find / -iname ro.lproj -exec rm {} \;




2. (șterge un dosar sau fișier din dosarul Applications, în cazul nostru ro.lproj)




sudo find /Applications -iname ro.lproj -exec rm {} \;




Eu vreau să facă o aplicație gen Monolingual.app, dar numai cu referire la ro.lproj și poate cu o posibilitatea de a alege calea (deoarce nu numai în .app va fi instalat un ro.lproj) sau aplicația din care să ștergă sau nu acel ro.lproj. Astfel că unui utilizator cu experiențe NULE în Terminal, nu îi pot da comanda și gata.





#7 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 26 March 2010 - 19:56

Am luat exemplul tău de mai sus.
L-am lăsat în cea mai mare parte așa cum este, doar userul și 'tt' am schimbat în altceva.
La fiecare linie mi-a dat eroare. Ce nu am făcut bine? Folosesc încă Xcode. 3.1.2
Adaug că în Foo.h am impoartat; #import <Foundation/Foundation.h, care e necesar pentru NSFileManager
În concluzie, nu a mers exemplul de la tine deocamdată.

#8 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 28 March 2010 - 12:46

Eu vad ca merge fain:

cd:tmp diciu$ cat test.m
#import <Cocoa/Cocoa.h>
int main()
{
	NSAutoreleasePool * p = [NSAutoreleasePool new];

	NSString * fpath = @"/Users/diciu/Desktop/tt";
        NSString * dirToRemove = @"tt";

        NSFileManager * fm  = [NSFileManager defaultManager];
        NSDirectoryEnumerator * de = [fm enumeratorAtPath:fpath];

        NSString *file;
        while (file = [de nextObject])
        {
                BOOL isDir;
                NSString * apath = [NSString stringWithFormat:@"%@/%@", fpath, file];
                if(([fm fileExistsAtPath:apath isDirectory:&isDir] && isDir) && ([[file lastPathComponent] isEqualToString:dirToRemove]))
                {
                        NSError * err = nil;
                        if(![fm removeItemAtPath:apath error:&err])
                                NSLog(@"Failed to remove: %@", apath);
                        else
                                NSLog(@"Removed %@", apath);
                }
        }

	[p release];
}
cd:tmp diciu$ gcc test.m -framework Cocoa
cd:tmp diciu$ ./a.out 
2010-03-28 13:44:10.594 a.out[11473:903] Removed /Users/diciu/Desktop/tt/gg/tt


#9 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 28 March 2010 - 22:34

Da, se pare că acum a mers și la mine. Adică nu a dat eroare Build & Go. Dar, nu știu de ce, nu a șters dosarul 'tt' de pe Desktop, cu mențiunea că eu am alt user.

Am mai meșterit ceva:

1. Acest cod îmi arată în console toate căile în care există ro.lproj. Mai exact numai din Applications. Idea este că nu știu cum să îl dezvolt pentru a și șterge ceea ce găsește. Poate mă ajuți.
Dacă voi folosi acest model. Va șterge ro.lproj și din alte aplicații în care pachetul de limbă română pentru Mac OS X 10.5.8 nu a instalat nimic Ex. ADOBE. Ceea ce nu ar fi de dorit. Totuși mă interesează să văd cum arată un final al acestei formule.

- (IBAction) searchRoFiles:(id)sender
{
NSFileManager *fm = [NSFileManager defaultManager];
NSDirectoryEnumerator *de = [fm enumeratorAtPath: @"/Applications/"];
for (NSString *pathName in de) if ([[pathName lastPathComponent] isEqualToString: @"ro.lproj"])
{NSLog(@"%@", pathName);}
}

2. Acest cod șterge instantaneu ceea ce îi pun în 'path'.M ai exact ceea ce se află în coadă la 'path' și tot conținutul său. E irevocabilă acțiune. Cred că voi alege această metodă. Deoarece îi pot spune exact de unde să ștergă și d eunde nu. Adică din ADOBE nu va șterge, dar va șterge de acolo de unde știu eu că pachetul de limbă română pentru Mac OS X 10.5.8 a instalat ceva. Știu, e muncă de chinez rău, trebuie să introduci fiecare 'Path' manual. Dar deocamdată altă metodă mai bună nu am găsit.

- (IBAction) destroyRoApps:(id)sender
{
NSFileManager *fm = [NSFileManager defaultManager];
[fm removeFileAtPath: @"/Applications/MobileConnect.app/Contents/Resources/ro.lproj", [NSString stringWithFormat:@"ro.lproj"] handler:nil];
}

Edited by Eugen Mihalache, 28 March 2010 - 22:39.


#10 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 29 March 2010 - 11:28

Da, se pare că acum a mers și la mine. Adică nu a dat eroare Build & Go. Dar, nu știu de ce, nu a șters dosarul 'tt' de pe Desktop, cu mențiunea că eu am alt user.


Nici nu-si doreste sa faca asta - re-citeste codul si vei intelege.
Sterge orice "tt" de sub "tt", respectiv:

/Users/diciu/Desktop/tt/gg/tt

sau

/Users/diciu/Desktop/tt/mm/gg/tt

Edited by Cristian Draghici, 29 March 2010 - 11:29.


#11 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 29 March 2010 - 13:02

Da, a funcționat.
Eu nu am mai pus nimic în dosarul 'tt'. Crede-am că va șterge și dosarul principal 'tt'.
După acest exemplu am înțeles perfect.
Îți mulțumesc.

Dar de cele două variante ale mele ce spui?

#12 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 29 March 2010 - 16:40

Da, a funcționat.
Eu nu am mai pus nimic în dosarul 'tt'. Crede-am că va șterge și dosarul principal 'tt'.
După acest exemplu am înțeles perfect.
Îți mulțumesc.

Dar de cele două variante ale mele ce spui?


Pai nu prea inteleg ce vrei sa faci. Un soi de un-installer?
N-am folosit niciodata, dar pkgutil pare sa stie deja sa faca asta.


cristi:~ diciu$ pkgutil --help
Usage: pkgutil [OPTIONS] [COMMANDS] ...
[..]

Database Commands:
  --files PKGID          List files installed by the specified package
  --unlink PKGID         Delete the files installed by the specified package

Pe un sistem cu pachetul de localizare instalat, asta ar trebui sa listeze fisierele instalate in color picker
pkgutil --files com.ro.macosx1058romaniantranslation.colorpickers.pkg


#13 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 29 March 2010 - 17:06

Da. un soi de unInstaller.app
Da, comanda respectivă e ok pentru teminal , dar nu șiu cum să o integrez în Objective-C.

Dar cred că mi-ai dat deja o idee. Sper să funcționeze.
Voi utiliza comnada în terminal pentru a-mi culege toate căile și a le da un copy/paste în codul meu din Xcode.

Sau avem cum să integrăm această comandă și în Objective-C?

#14 Cristian Draghici

Cristian Draghici

    Membru nou

  • Membri
  • Pip
  • 12 posts
  • LocationBucuresti

Posted 30 March 2010 - 06:50

Da. un soi de unInstaller.app
Da, comanda respectivă e ok pentru teminal , dar nu șiu cum să o integrez în Objective-C.

Dar cred că mi-ai dat deja o idee. Sper să funcționeze.
Voi utiliza comnada în terminal pentru a-mi culege toate căile și a le da un copy/paste în codul meu din Xcode.

Sau avem cum să integrăm această comandă și în Objective-C?


Se poate integra, dar din pacate pkgutil foloseste un framework privat:
cristi:~ diciu$ otool -L /usr/sbin/pkgutil
/usr/sbin/pkgutil:
	/System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom (compatibility version 2.0.0, current version 164.0.0)

La modul mai ne-elegant, se poate rula comanda din Cocoa -> vezi sursele de aici pentru ceva similar:
http://download.dv8....s/TesseractGUI/

In TFTesseractWrapper.m, vezi folosirea lui NSTask si NSPipe.

#15 Eugen Mihalache

Eugen Mihalache

    Psihoterapeut

  • Membri
  • PipPipPipPipPip
  • 1620 posts
  • LocationBad Griesbach im Rottal

Posted 30 March 2010 - 11:47

Inițial mă gândeam la NSTask și NSPipe. Dar după cum și tu ai spus, mi s-au părut destulde ne-elegante.
Destul de complicat pentru mine, de a le transpune nevoiilor mele. Dar am să încerc și implementarea lor.

Edited by Eugen Mihalache, 30 March 2010 - 11:52.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users