1

私がuoに付属しているものよりも、単純な文字列操作を行う簡単な方法が必要です。ユーザーがディレクトリ内のファイルを複製できるようにする方法があります。テーブルビューでそれを選択してクローンボタンを押すと、ファイルのコピーが保存され、fileNameにサブストリングCopyが追加されます。コピーがすでに存在する場合は、ファイル名を繰り返し、ループの繰り返しによってファイル名を追加する必要があります。例えば;

<filename> Copy 1
<filename> Copy 2
until my other method return that the name is unique.

渡されたファイル名を3つの基準で調べる必要があります。すでに「コピー」が追加されていますか?すでに文字列番号が追加されていますか?その場合、番号の値を1つずつ繰り返して、元に戻します。

かなりの時間の後、私はこれを思い付くことができました:

//Tokenize the string
NSArray *filenameArray =[copyName componentsSeparatedByString:@" "];

//Make sure the name is unique
//Update the namesArray
[self montageNameList];
int i = 1;
for(NSString * name in self.montageNames){

    if([channelSetManager_ checkNoDuplicateName:self.montageNames forThisName:copyName]== YES){
        break;
    }else{

        if([[filenameArray lastObject]isEqualToString:@"Copy"]){

            //Just add a number to the end of the string
            copyName = [copyName stringByAppendingFormat:@" %d", i];

        }else if(([[filenameArray lastObject]intValue] > -1) && ([[filenameArray lastObject]intValue] < 100)){

            i = [[filenameArray lastObject]intValue]+1;
            NSInteger len = [[filenameArray lastObject]length]+1;
            copyName = [copyName substringToIndex:[copyName length] - len ];
            copyName = [copyName stringByAppendingFormat:@" %d",i];
        }

    }


}

これは機能しますが、正しい方法ではないようです。アドバイスをいただければ幸いです。

4

1 に答える 1

0

過去に、を使用して一時ファイルを作成し、一時ファイルをmkstemp()永続ファイルにリンクし、ファイルが存在する状態でリンクが失敗した場合は次のファイル名を試し、リンクが成功するまで繰り返し、一時ファイルのリンクを解除しました。

// Finds next available copy name and creates empty file as place holder
- (NSString *) createCopyFileWithBasename:(NSString *)baseName andSuffix:(NSString *)suffix
{
    char tmpFile[1024];
    char copyFile[1024];
    int  fd;
    int  count;

    // create unique temporary file
    snprintf(tmpFile, 1024, "%s.XXXXXXXX", [baseName UTF8String]);
    if ((fd = mkstemp(tmpFile)) == -1)
    {
       NSLog(@"mkstemp(): %s", strerror(errno));
       return(nil);
    };
    close(fd);

    // attempt to create empty file for file copy
    snprintf(copyFile, 1024, "%s Copy.%s", [baseName UTF8String], [suffix UTF8String]);
    switch(link(tmpFile, copyFile))
    {
       case EEXIST: // file exists, skip to next possible name
       break;

       case: 0: // excellent, we found an available file name
       unlink(tmpFile);
       return([NSString stringWithUTF8String:copyFile]);

       default:
       NSLog(@"link(): %s", strerror(errno));
       unlink(tmpFile);
       return(nil);
    };

    // loop through possible iterations of file copy's name
    for(count = 1; count < 1024; count++)
    {
       snprintf(copyFile, 1024, "%s Copy %i.s", [baseName UTF8String], count, [suffix UTF8String]);
       switch(link(tmpFile, copyFile))
       {
          case EEXIST: // file exists, skip to next possible name
          break;

          case: 0: // excellent, we found an available file name
          unlink(tmpFile);
          return([NSString stringWithUTF8String:copyFile]);

          default:
          NSLog(@"link(): %s", strerror(errno));
          unlink(tmpFile);
          return(nil);
       };
    };

   unlink(tmpFile);
   NSLog(@"link(): %s", strerror(errno));

   return(nil);
}

使用例:

NSString copyFileName = [self createCopyFileWithBasename:@"My Data" andSuffix:@".txt"];
于 2012-06-06T01:14:07.417 に答える