24

同じディレクトリにファイルを保持したまま、ファイルの名前を変更するにはどうすればよいですか?

ファイルへのフルパスを含む文字列と、新しいファイル名を含む(パスなしの)文字列があります。次に例を示します。

NSString *old_filepath = @"/Volumes/blah/myfilewithrubbishname.avi";
NSString *new_filename = @"My Correctly Named File.avi";

NSFileManagerのmovePath:toPath:handler:メソッドについては知っていますが、新しいファイルのパスを作成する方法を理解できません。

基本的に、私は次のPythonコードに相当するものを探しています。

>>> import os
>>> old_filepath = "/Volumes/blah/myfilewithrubbishname.avi"
>>> new_filename = "My Correctly Named File.avi"
>>> dirname = os.path.split(old_filepath)[0]
>>> new_filepath = os.path.join(dirname, new_filename)
>>> print new_filepath
/Volumes/blah/My Correctly Named File.avi
>>> os.rename(old_filepath, new_filepath)
4

5 に答える 5

36

NSFileManager と NSWorkspace の両方にファイル操作メソッドがありますが、- (BOOL)movePath:(NSString *)source toPath:(NSString *)destination handler:(id)handlerおそらく NSFileManager が最善の策です。NSString のパス操作メソッドを使用して、ファイルとフォルダーの名前を正しく取得します。例えば、

NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
[[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];

どちらのクラスもドキュメントで十分に説明されていますが、わからないことがあればコメントを残してください。

于 2009-05-16T23:31:19.723 に答える
14

ファイルをそれ自体に移動すると失敗することに注意してください。スペースをアンダースコアに置き換え、ファイル名を小文字にし、ファイルの名前を新しい名前に変更する方法がありました。名前に単語が1つしかないファイルでは、大文字と小文字を区別しないファイルシステムで新しい名前が同じになるため、名前の変更に失敗します。

これを解決する方法は、2段階の名前変更を行うことでした。最初にファイルの名前を一時的な名前に変更し、次に目的の名前に名前を変更しました。

これを説明するいくつかの擬似コード:

NSString *source = @"/FILE.txt";
NSString *newName = [[source lastPathComponent] lowercaseString];
NSString *target = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];

[[NSFileManager defaultManager] movePath:source toPath:target error:nil]; // <-- FAILS

ソリューション:

NSString *source = @"/FILE.txt";
NSString *newName = [[source lastPathComponent] lowercaseString];

NSString *temp = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@-temp", newName]];
NSString *target = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];

[[NSFileManager defaultManager] movePath:source toPath:temp error:nil];
[[NSFileManager defaultManager] movePath:temp toPath:target error:nil];
于 2009-06-06T02:03:40.910 に答える
8

私はこれを初心者にとって理解しやすくしたかっただけです。すべてのコードは次のとおりです。

    NSString *oldPath = @"/Users/brock/Desktop/OriginalFile.png";
NSString *newFilename = @"NewFileName.png";

NSString *newPath = [[oldPath stringByDeletingLastPathComponent] stringByAppendingPathComponent:newFilename];
[[NSFileManager defaultManager] movePath:oldPath toPath:newPath handler:nil];

NSLog( @"File renamed to %@", newFilename );
于 2009-05-17T00:07:53.583 に答える