1

フォルダー構造に要素のリストがあります。

  • /フォルダ/myfile.pdf
  • /フォルダ/サブフォルダ1/myfile.pdf
  • /フォルダ/サブフォルダ2/myfile.pdf
  • /folder/subfolder3/another/myfile.pdf

私の目標は、ファイル名に一致するファイルの配列を構築するために構造を横断することですが、配列内のアイテムの最初の出現は、フォルダーのルートに最も近いものになります。

幅優先トラバーサルについて説明を受けましたが、混乱しています。

私はこのアプローチを取り始めましたが、結果は私のニーズを満たしていません...助けていただければ幸いです!

NSMutableArray * directories = [NSMutableArray new];
NSDirectoryEnumerator *enumerator = [[[NSFileManager defaultManager] enumeratorAtPath:url] retain] ;

if( [[filePath lastPathComponent] isEqualToString:@"myfile.pdf"] ){
    [directories addObject:[url stringByAppendingString:filePath]];
}

if(directories)
 sourceUrl_ = [[NSURL fileURLWithPath:[directoriesToWalk objectAtIndex:0] ] retain];
4

1 に答える 1

2

これは、あなたが説明したようなものの実際の例です:

NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager]
                                     enumeratorAtPath:@"/Users/bdesham/Sites"];

NSMutableArray *htmlFiles = [NSMutableArray new];

NSURL *path;
while (path = [enumerator nextObject]) {
    if ([[path lastPathComponent] isEqualToString:@"index.html"]) {
        [htmlFiles addObject:@{ @"level" : [NSNumber numberWithInteger:[enumerator level]],
                                @"path" : path }];
    }
}

[htmlFiles sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1[@"level"] integerValue] > [obj2[@"level"] integerValue];
}];

NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[htmlFiles count]];

[htmlFiles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [paths addObject:obj[@"path"]];
}];

ここでの考え方は次のとおりです。

  1. 対象のフォルダー内のすべてのファイルを列挙します。
  2. 必要なファイル名を持つファイルごとに、それをhtmlFiles配列に追加します。ファイルはディクショナリとして追加されるため、深さ ( を呼び出した結果-[NSDirectoryEnumerator level]) を各ファイル名とともに保存できます。
  3. これで、関心のあるすべてのファイルを含む配列ができました。
  4. @"level"ファイルの深さ (ディクショナリのキー)に従って配列を並べ替えます。
  5. 辞書のパス名はもう必要ないので、パス名だけを含む新しい配列を作成します (ただし、以前と同じソート順で)。

このコードの最後で、paths配列にはNSURL「index.html」という名前のすべてのファイルの s が含まれ、ルートに最も近いファイルが最初に、ルートから最も遠いファイルが最後になります。(同じディレクトリ レベルにある 2 つのファイルの配列内での順序は定義されていないことに注意してください。)

于 2013-08-13T19:56:48.880 に答える