回答:
let documentsURL = try! FileManager().url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true)
...ドキュメントディレクトリのファイルURLを提供します。次は、foo.htmlという名前のファイルがあるかどうかをチェックします。
let fooURL = documentsURL.appendingPathComponent("foo.html")
let fileExists = FileManager().fileExists(atPath: fooURL.path)
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];
[0]
、インデックスアクセスを介して
firstObject
であるnil
アップルの枠組みの中で何かが真剣に壊れているように、プログラムを継続する可能性がどのように何の賢明な方法は、ありません。
アップルでは、fileExistAtPath:メソッドに依存しないことをお勧めしています。多くの場合、ファイルを開いて、ファイルが存在しない場合はエラーに対処することをお勧めします。
NSFileManagerクラスリファレンス
注:ファイルシステムまたはファイルシステム上の特定のファイルの現在の状態に基づいて動作を述語化することはお勧めしません。これを行うと、奇妙な動作や競合状態が発生する可能性があります。操作(ファイルのロードやディレクトリの作成など)を試行してエラーを確認し、それらのエラーを適切に処理する方が、操作が成功するかどうかを事前に把握するよりもはるかに優れています。ファイルシステムの競合状態の詳細については、 『Secure Coding Guide』の「Race Conditions and Secure File Operations」を参照してください。
出典:Apple Developer API Reference
安全なコーディングガイドから。
これを防ぐために、プログラムは特定の名前の一時ファイルがターゲットディレクトリにまだ存在していないことを確認することがよくあります。そのようなファイルが存在する場合、アプリケーションはそのファイルを削除するか、競合を回避するために一時ファイルの新しい名前を選択します。ファイルが存在しない場合、アプリケーションは書き込み用にファイルを開きます。書き込み用にファイルを開くシステムルーチンが存在しない場合、新しいファイルが自動的に作成されるためです。攻撃者は、適切な名前で新しい一時ファイルを作成するプログラムを継続的に実行することにより、一時的なファイルが存在しないことを確認するためにアプリケーションがチェックしたときのギャップに、ファイルを作成することができます(少ししつこく、運がいい)。そしてそれが書くためにそれを開くとき。次に、アプリケーションは攻撃者のファイルを開いて書き込みます(システムルーチンが既存のファイルを開いている場合は、それを開きます。既存のファイルがない場合にのみ新しいファイルを作成します)。攻撃者のファイルは、アプリケーションの一時ファイルとは異なるアクセス許可を持っている可能性があるため、攻撃者はコンテンツを読み取ることができます。または、攻撃者はファイルを既に開いている可能性があります。攻撃者はファイルを他のファイル(攻撃者が所有するファイルまたは既存のシステムファイル)へのハードリンクまたはシンボリックリンクに置き換える可能性があります。たとえば、攻撃者はこのファイルをシステムパスワードファイルへのシンボリックリンクに置き換えることができるため、攻撃後、システム管理者を含む誰もログインできなくなるほどシステムパスワードが破損します。または、攻撃者はファイルを既に開いている可能性があります。攻撃者はファイルを他のファイル(攻撃者が所有するファイルまたは既存のシステムファイル)へのハードリンクまたはシンボリックリンクに置き換える可能性があります。たとえば、攻撃者はこのファイルをシステムパスワードファイルへのシンボリックリンクに置き換えることができるため、攻撃後、システム管理者を含む誰もログインできなくなるほどシステムパスワードが破損します。または、攻撃者はファイルを既に開いている可能性があります。攻撃者はファイルを他のファイル(攻撃者が所有するファイルまたは既存のシステムファイル)へのハードリンクまたはシンボリックリンクに置き換える可能性があります。たとえば、攻撃者はこのファイルをシステムパスワードファイルへのシンボリックリンクに置き換えることができるため、攻撃後、システム管理者を含む誰もログインできなくなるほどシステムパスワードが破損します。
別の方法でファイルシステムを設定したり、ファイルシステムを設定する別の方法を探したり、ドキュメントフォルダーにファイルが存在するかどうかを確認したりする場合は、別の例をご覧ください。動的チェックも表示
for (int i = 0; i < numberHere; ++i){
NSFileManager* fileMgr = [NSFileManager defaultManager];
NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString* imageName = [NSString stringWithFormat:@"image-%@.png", i];
NSString* currentFile = [documentsDirectory stringByAppendingPathComponent:imageName];
BOOL fileExists = [fileMgr fileExistsAtPath:currentFile];
if (fileExists == NO){
cout << "DOESNT Exist!" << endl;
} else {
cout << "DOES Exist!" << endl;
}
}
Swift 2.0
これは、Swiftを使用してファイルが存在するかどうかを確認する方法です
func isFileExistsInDirectory() -> Bool {
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDirectory: AnyObject = paths[0]
let dataPath = documentsDirectory.stringByAppendingPathComponent("/YourFileName")
return NSFileManager.defaultManager().fileExistsAtPath(dataPath)
}
document / catchimageパスの横にファイルが存在するかどうかを確認します。
NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *tempName = [NSString stringWithFormat:@"%@/catchimage/%@.png",stringPath,@"file name"];
NSLog(@"%@",temName);
if([[NSFileManager defaultManager] fileExistsAtPath:temName]){
// ur code here
} else {
// ur code here**
}
NSArray *directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *imagePath = [directoryPath objectAtIndex:0];
//If you have superate folder
imagePath= [imagePath stringByAppendingPathComponent:@"ImagesFolder"];//Get docs dir path with folder name
_imageName = [_imageName stringByAppendingString:@".jpg"];//Assign image name
imagePath= [imagePath stringByAppendingPathComponent:_imageName];
NSLog(@"%@", imagePath);
//Method 1:
BOOL file = [[NSFileManager defaultManager] fileExistsAtPath: imagePath];
if (file == NO){
NSLog("File not exist");
} else {
NSLog("File exist");
}
//Method 2:
NSData *data = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:data];
if (!(image == nil)) {//Check image exist or not
cell.photoImageView.image = image;//Display image
}
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
そのために提供されたNSURL.h
NSURL *fileURL = [NSURL fileURLWithPath:NSHomeDirectory()];
NSError * __autoreleasing error = nil;
if ([fileURL checkResourceIsReachableAndReturnError:&error]) {
NSLog(@"%@ exists", fileURL);
} else {
NSLog(@"%@ existence checking error: %@", fileURL, error);
}
またはSwiftを使用する
if let url = URL(fileURLWithPath: NSHomeDirectory()) {
do {
let result = try url.checkResourceIsReachable()
} catch {
print(error)
}
}