2012-02-29 5 views
0

나는이 코드를 가지고있다.파이어 폭스 디렉토리

NSString *pathName = [@"/Users/" stringByAppendingString:NSUserName()]; 
     pathName = [pathName stringByAppendingString:@"/Library/Application Support/AddressBook/Configuration.plist"]; 
     [[NSFileManager defaultManager] removeItemAtPath:pathName error:nil]; 

나는이 디렉토리를 사용하기를 원하지만 cbk4yc7r.default의 폴더가있다. 각 사용자에 대해 cbk4yc7r이 변경됩니다. 이 디렉토리를 사용하도록 코드를 수정하려면 어떻게해야합니까?

"/Library/Application Support/Firefox/Profiles/cbk4yc7r.default/places.sqlite" 

나는 "/ 라이브러리/응용 프로그램 지원/파이어 폭스/프로필/*. 기본/places.sqlite"을 시도했지만 목표 - C에서 작동하지 않습니다.

도와 주시겠습니까? 감사합니다, 당신이 할 수있는 당신이 cbk4yc7r은 각 사용자에 대해 무엇을 알고 가정

답변

0

:

user.dirstring는 각 사용자에 대한 cbk4yc7r의 동등한입니다
[NSString stringWithFormat:@"/Library/Application Support/Firefox/Profiles/%@.default/places.sqlite", user.dirString]; 

. 당신이 두 번째로 그 디렉토리 내부의 프로파일이 ~/라이브러리/Application Support/파이어 폭스/profiles.ini 파일에 의해 정의 된 적절한 상위 디렉토리를 얻을 수

NSString *pathName = [@"~/Library/Application Support/Firefox/Profiles/" stringByExpandingTildeInPath]; 

를 사용한다

+0

user.dirstring의 사용자는 신고되지 않았습니다. 뭔가 잘못? – Joannes

+0

'user.dirstring'은 각 사용자마다 다른 문자열에 액세스하는 방법에 대한 예입니다. 이것은 당신이 편리하게 사용하는 변수로 대체되어야합니다 (아래 @valexa에 설명 된대로 profiles.ini를 파싱 한 결과 일 수 있습니다). –

0

우선 예를 들어, 당신이 profiles.ini 구문 분석하거나 (있는 경우) 프로필 ID를 결정하는 가장 좋은 방법은 몇 가지 파이어 폭스 API를 사용하는 것입니다

[[NSFileManager defaultManager] contentsOfDirectoryAtPath:pathName error:&error]; 
0

사용해야하므로 "경로 = 정보/cbk4yc7r.default". 그러나 이것이 가능한지를 알기에 파이어 폭스 내부 정보를 잘 모릅니다. I 은 단일 사용자가 여러 개의 프로필을 가질 수 있다는 것을 알고 있지만 고려해야 할 사항입니다.

또한 (당신도 솔직히 다른 응답자) 디렉토리 구조에 대해 많은 보장을하지 못하는 가정을하고 있습니다. 또한 모든 것이 올바르게 작동한다고 가정하고 있습니다. 물론 디스크 작동을 보장하지는 않습니다. 이러한 고려 사항을 염두에두고, 저는 재단이 제공 한 추상화를 상당히 철저하게 사용하는 다음을 제출합니다. 또한 적절한 경우 최신 NSURL을 사용합니다.

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *appDirErr; 
    NSURL *appSupportDir = [fileManager URLForDirectory:NSApplicationSupportDirectory 
               inDomain:NSUserDomainMask 
             appropriateForURL:nil 
               create:NO 
                error:&appDirErr]; 

    if (appSupportDir) { 
     NSURL *firefoxDir = [appSupportDir URLByAppendingPathComponent:@"Firefox/Profiles" 
                  isDirectory:YES]; 
     NSError *profileErr; 
     NSArray *profileURLs = [fileManager contentsOfDirectoryAtURL:firefoxDir 
              includingPropertiesForKeys:nil 
                  options:0 
                   error:&profileErr]; 
     if (profileURLs) { 
      for (NSURL *currentProfileURL in profileURLs) { 
       NSURL *removalURL = [currentProfileURL URLByAppendingPathComponent:@"places.sqlite" 
                     isDirectory:NO]; 
       NSError *removalErr; 
       if (! [fileManager removeItemAtURL:removalURL error:&removalErr]) { 
        NSLog(@"Error! %@", [removalErr localizedDescription]); 
       } 

      } 
     } 
     else { 
      NSLog(@"Error! %@", [profileErr localizedDescription]); 
     } 
    } 
    else { 
     NSLog(@"Error! %@", [appDirErr localizedDescription]); 
    } 
+0

와우 ... 내 코드가 전체 프로필을 제거합니다 ... 잠시 후 ... –

+0

수정. 업데이트 된 코드를 참조하십시오. –

+0

Firefox API에 대해 잘 모릅니다. AppleScript 편집기에서 * .default/places.sqlite를 사용하지만 objective-c에서는 작동하지 않습니다. 더 쉬운 해결책? – Joannes