2012-03-30 174 views
0

我在使用MacOS X中的NSFileManager創建文件夾時遇到了一些問題。我在Lion中創建軟件,如果這改變了任何東西。獲取使用NSFileManager創建新文件夾的權限

無論如何。程序結構如下:

  1. 填寫一些字段。
  2. 使用NSOpenPanel選擇一個文件夾。
  3. 該程序從字段中生成新文件夾的名稱。
  4. 在所選文件夾中創建一個具有該名稱的文件夾。

是應該創建該文件夾中的代碼看起來是這樣的:

NSString *name = [pnameField stringValue]; 
NSString *number = [self parseVerknr:[pnumberField stringValue]]; 
NSString *date = [pdateField stringValue]; 
NSString *folderName; 

//Here I generate the folder name from some rules and stuffsies 
//It ends up as something like: 13245_08 - cp. - name 

NSOpenPanel *myPanel = [NSOpenPanel openPanel]; 

    myPanel.canChooseFiles = NO; 
    myPanel.canChooseDirectories = YES; 
    myPanel.canCreateDirectories = YES; 

    [myPanel beginWithCompletionHandler:^(NSInteger result){ 

     if (result==NSFileHandlingPanelOKButton){ 

      NSFileManager *myManager = [[NSFileManager alloc] init]; 

      NSError *merror; 

      NSString *directoryString = [NSString stringWithFormat:@"%@%@", [myPanel.URL absoluteString], folderName]; 

      //Here the directory string looks like file://localhost/Users/username/Documents/folders/12345_09 - cp. - Koop 
      directoryString = [directoryString substringFromIndex:6]; 
      //After it looks like: /localhost/Users/username/Documents/folders/12345_09 - cp. - Koop 
      NSLog(@"directory: %@", directoryString); 

      [myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror]; 

      NSLog(@"%@", [merror localizedDescription]); 
     } 

    }]; 

如果我不採取從指數6我得到一個大錯誤棧子(試圖把它從16也是這樣做的)。如果我使用分割字符串我得到以下錯誤:

You don’t have permission to save the file 「localhost」 in the folder 「PK Bear」. 

由於PK熊是我的「硬盤」我猜程序需要獲得許可,訪問硬盤驅動器的名稱。我只是不知道該怎麼做。

任何幫助將不勝感激。

回答

1

問題是您創建路徑字符串的方式。特別是,-[NSURL absoluteString]返回URL的字符串表示形式,而不是文件路徑字符串。你應該使用NSURL和NSString的方法來處理路徑。如documentation中所述,-[NSURL path]返回適合輸入到NSFileManager方法的路徑字符串。

試試這個:

NSString *directoryString = [[myPanel.URL path] stringByAppendingPathComponent:folderName]; 
[myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror]; 
+0

工作就像一個魅力,非常感謝!我一定會讀到兩者之間的區別。 – Bjorninn 2012-03-30 17:53:05

1

你混淆了(文件)的URL和(UNIX)路徑。

如下您應該創建的目錄路徑:

NSString *directoryString = [[myPanel.URL path] stringByAppendingPathComponent:folderName]; 
if (! [myManager createDirectoryAtPath:directoryString withIntermediateDirectories:YES attributes:nil error:&merror]) { 
    NSLog(@"%@", [merror localizedDescription]); 
} 

主要是利用path代替absoluteString

另外:除非創建它的方法返回NO(或任何錯誤條件),否則不能訪問merror對象。

你永遠不應該擺弄路徑字符串中的單個字符(就像你用substringFromIndex:做的那樣)。這被認爲是面對Unicode代碼點與代碼片段和組合字符的高級任務。

+0

感謝您的回答。我需要更好地使用NSError對象,謝謝指針。 – Bjorninn 2012-03-30 17:56:50