219

アプリ内購入を使用するアプリケーションがあります。ユーザーが何かを購入したら、1つのhtmlファイルをアプリのDocumentsフォルダーにダウンロードします。

ここで、このHTMLファイルが存在するかどうかを確認する必要があるため、trueの場合は、このHTMLファイルをロードし、そうでない場合は、デフォルトのhtmlページをロードします。

どうすればそれができますか?とNSFileManager私は外に出ることができませんmainBundle..

4

7 に答える 7

526

スウィフト3:

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)

Objective-C:

NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];
于 2009-10-28T17:37:11.977 に答える
14

Apple は、fileExistAtPath: メソッドに依存しないことをお勧めします。ファイルが存在しない場合は、ファイルを開いてエラーに対処する方がよい場合がよくあります。

NSFileManager クラス リファレンス

注: ファイル システムまたはファイル システム上の特定のファイルの現在の状態に基づいて動作を推測しようとすることはお勧めしません。これを行うと、奇妙な動作や競合状態が発生する可能性があります。操作 (ファイルの読み込みやディレクトリの作成など) を試み、エラーをチェックし、それらのエラーを適切に処理する方が、操作が成功するかどうかを事前に判断しようとするよりもはるかに優れています。ファイル システムの競合状態の詳細については、セキュア コーディング ガイドの「競合状態とセキュア ファイル操作」を参照してください。

出典: Apple Developer API リファレンス

セキュアコーディングガイドより。

これを防ぐために、プログラムはしばしば、特定の名前の一時ファイルがターゲット ディレクトリにまだ存在しないことを確認します。そのようなファイルが存在する場合、アプリケーションはそのファイルを削除するか、競合を避けるために一時ファイルに新しい名前を選択します。ファイルが存在しない場合、アプリケーションは書き込み用にファイルを開きます。これは、ファイルが存在しない場合、書き込み用にファイルを開くシステム ルーチンが自動的に新しいファイルを作成するためです。攻撃者は、適切な名前の新しい一時ファイルを作成するプログラムを継続的に実行することで、一時ファイルが存在しないことを確認するためにアプリケーションがチェックする間のギャップにファイルを作成できます (少しの永続性と運があれば)。書き込み用に開いたとき。次に、アプリケーションは攻撃者のファイルを開き、それに書き込みます (システム ルーチンは、既存のファイルが存在する場合はそれを開きます。既存のファイルがない場合にのみ、新しいファイルを作成します)。攻撃者のファイルは、アプリケーションの一時ファイルとは異なるアクセス許可を持っている可能性があるため、攻撃者はコンテンツを読み取ることができます。または、攻撃者がファイルを既に開いている可能性があります。攻撃者は、ファイルを他のファイル (攻撃者が所有するファイルまたは既存のシステム ファイル) へのハード リンクまたはシンボリック リンクに置き換える可能性があります。たとえば、攻撃者はファイルをシステム パスワード ファイルへのシンボリック リンクに置き換えることができます。これにより、攻撃後にシステム パスワードが破損し、システム管理者を含む誰もログインできなくなる可能性があります。または、攻撃者がファイルを既に開いている可能性があります。攻撃者は、ファイルを他のファイル (攻撃者が所有するファイルまたは既存のシステム ファイル) へのハード リンクまたはシンボリック リンクに置き換える可能性があります。たとえば、攻撃者はファイルをシステム パスワード ファイルへのシンボリック リンクに置き換えることができます。これにより、攻撃後にシステム パスワードが破損し、システム管理者を含む誰もログインできなくなる可能性があります。または、攻撃者がファイルを既に開いている可能性があります。攻撃者は、ファイルを他のファイル (攻撃者が所有するファイルまたは既存のシステム ファイル) へのハード リンクまたはシンボリック リンクに置き換える可能性があります。たとえば、攻撃者はファイルをシステム パスワード ファイルへのシンボリック リンクに置き換えることができます。これにより、攻撃後にシステム パスワードが破損し、システム管理者を含む誰もログインできなくなる可能性があります。

于 2013-07-26T09:08:58.930 に答える
8

ファイル システムを別の方法で設定したり、別の方法でファイル システムを設定したり、ファイルがドキュメント フォルダーに存在するかどうかを確認したりする場合は、別の例を次に示します。動的チェックも表示

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;
    }
}
于 2012-03-08T20:29:50.550 に答える
4

スイフト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)
}
于 2016-04-30T00:29:59.820 に答える
0
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
}
于 2019-01-01T05:28:59.733 に答える