2

これが私のコードです。

NSArray *pathSong = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *toPath = [[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"Songs"];
    NSString *fromPath=[[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"abc"];
    NSString *strdestination = [fromPath stringByAppendingPathComponent:@"sg.mp3"];
    NSError *Error;
    if([[NSFileManager defaultManager]fileExistsAtPath:strdestination]){
        if([[NSFileManager defaultManager]copyItemAtPath:strdestination toPath:toPath error:&Error]==NO){
            UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [Alert show];
        }
        else{
            UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"Not copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [Alert show];
        }
    }

エラーロゴが表示されます:

エラードメイン=NSCocoaErrorDominCode= 516 "操作を完了できませんでした。(Cocoaarrow 516.)" userInfo = 0x681abf0

NSUnderlyingError =0x681b920"操作を完了できませんでした。ファイルが存在します"

abcフォルダに曲名「sg.mp3」がありませんが、ファイルが存在するというエラーが発生します。どこで間違えたのかわからない?

4

4 に答える 4

11

コードには2つの問題があります。

  1. ファイルがすでに存在する場合は、ファイルを削除する必要があります
  2. 宛先ファイルの名前を指定する必要があります。つまり、次のように使用する場合です。

NSString *toPath = [[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"Songs"];

[[NSFileManager defaultManager]copyItemAtPath:strdestination toPath:toPath error:&Error];

その後、コピーが発生すると、Sg.mp3ファイルがタイプなしのSongsとしてコピーされます。

したがって、次のように記述する必要があります。

NSArray *pathSong = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *tempPath = [[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"Songs"];
NSString *toPath = [tempPath stringByAppendingPathComponent:@"yourFileName.mp3"];
NSString *fromPath = [[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"abc"];
NSString *strdestination = [fromPath stringByAppendingPathComponent:@"sg.mp3"];
NSError *Error = nil;

if([[NSFileManager defaultManager]fileExistsAtPath:strdestination])
{

  if([[NSFileManager defaultManager]copyItemAtPath:strdestination toPath:toPath error:&Error]==NO)
   {
       UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
       [Alert show];
   }
   else
   {
      [fileManager removeItemAtPath:strdestination error:NULL];
       UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"Not copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
       [Alert show];
   }
}

このコードは、宛先に存在する場合はファイルを削除してから、sg.mp3fromabcフォルダーからSongsフォルダーに名前を付けてコピーしますyourFileName.mp3

于 2012-08-17T17:31:19.290 に答える
3

Midhun MPの回答を利用して、ここにヘルパーがいます

BOOL moveFile(NSString *srcPath, NSString *dstPath)
{
    NSLog(@"moving %@ -> %@", srcPath, dstPath);

    NSFileManager *fm = [NSFileManager defaultManager];
    if ([fm fileExistsAtPath:dstPath])
    {
        // in my usecase this is a hard error, bolt to prevent overwriting
        return NO;
    }

    if ([fm fileExistsAtPath:srcPath])
    {
        NSError *error = nil;
        NSString *destDir = [dstPath stringByDeletingLastPathComponent];
        [fm createDirectoryAtPath:destDir withIntermediateDirectories:YES attributes:nil error:nil];

        if ([[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dstPath error:&error]==NO)
        {
            NSLog(@"failure declassing %@", srcPath);
            return NO;
        }
        else
        {
            [fm removeItemAtPath:srcPath error:NULL]; // gr8t success
            return YES;
        }
    }

    return NO;
 }
于 2015-02-04T12:50:01.283 に答える
0

ファイルを自分のコピーで上書きしようとしているからだと思います。

パーミッションマスクを確認し、ドキュメントディレクトリの代わりにキャッシュを使用してみてください。

意味ですかif(!fileExistsAtPath)

于 2012-08-17T11:48:58.877 に答える
0

すでに存在するファイルを削除する必要があります。

NSArray *pathSong = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *toPath = [[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"Songs"];
NSString *fromPath=[[pathSong objectAtIndex:0] stringByAppendingPathComponent:@"abc"];
NSString *strdestination = [fromPath stringByAppendingPathComponent:@"sg.mp3"];
NSError *Error;


//DELETE THE FILE AT THE LOCATION YOU'RE COPYING TO
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:strdestination error:NULL];


if([[NSFileManager defaultManager]copyItemAtPath:strdestination toPath:toPath error:&Error]==NO){
        UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [Alert show];
    }
else{
        UIAlertView *Alert=[[UIAlertView alloc]initWithTitle:@"Not copy" message:[NSString stringWithFormat:@"%@",Error] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [Alert show];
    }
于 2012-08-17T11:50:50.050 に答える