2014-10-05 113 views
1

我在下面使用此代碼複製在文件瀏覽器中選擇的文件,並將其複製到具有不同名稱的臨時目錄中。但是當我選擇一個包含空格的文件時,程序會拋出一個錯誤,說它找不到指定的精細路徑。我曾嘗試使用轉義方法,但它們也不起作用。有沒有其他的方式來處理空格的文件名?如何處理帶空格的文件名?

代碼從這裏開始:

[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { 
    [openPanel close]; 

    if (result == NSFileHandlingPanelOKButton) { 
     myString = [self randomStringWithLength:7]; 
     NSString *filePath = [[[openPanel URLs] objectAtIndex:0] absoluteString]; 

     NSLog(@"%@", filePath); 

     NSString *strTemp = [self extractString:filePath toLookFor:@"//" skipForwardX:2 toStopBefore:@".png"]; 
     NSLog(@"%@",strTemp); 
     NSString *realThing = [strTemp stringByReplacingOccurrencesOfString:@"%20" withString:@"\\ "]; 
     //strTemp = [strTemp stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSLog(@"%@", realThing); 

     NSString* fullPath = [NSString stringWithFormat:@"/tmp/%@.png", myString]; 
     NSLog(fullPath); 


     NSError *error = nil; 
     [[NSFileManager defaultManager] copyItemAtPath:realThing toPath:fullPath error:&error]; 
     if(error) { 
      NSLog(@"Error!!!"); 
      NSLog(@" error => %@ ",error); 
     } 
     else { 
      NSLog(@"Saved to temp directory"); 
     } 

任何人有這方面的經驗?謝謝

回答

2

您將URL轉換爲路徑太複雜且容易出錯。 只需使用path方法:

NSString *filePath = [[[openPanel URLs] objectAtIndex:0] path]; 

或者,使用copyItemAtURL:...代替copyItemAtPath:...

您還應該檢查的copyItemAtPath:...返回值作爲失敗的指標 :

if (![[NSFileManager defaultManager] copyItemAtPath:filePath toPath:fullPath error:&error]) { 
    NSLog(@" error => %@ ",error); 
} 

比較Handling Error Objects Returned From Methods

重要:成功或失敗的指示返回值爲 方法。雖然間接返回錯誤對象的Cocoa方法在 中,但如果 方法通過直接返回nil或NO指示失敗,那麼Cocoa錯誤域將保證返回此類對象,因此您應該在嘗試 之前始終檢查返回值是否爲「否」或「否」對NSError對象做任何事情。

+0

謝謝!鍛鍊了一種享受! – 2014-10-05 10:09:11

0

你似乎試圖手動將URL轉換爲文件路徑。改爲使用fileSystemRepresentation。

+0

'fileSystemRepresentation'是一個'NSString'方法,並返回一個C字符串,可以與'open()'或'rename()'等「低級」函數一起使用。 – 2014-10-05 09:42:00