2011-09-22 1 views
0

De tous les exemples que j'ai vus, je crois que je fais bien. Voici mon code:iPhone si le fichier existe numéro

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
NSUserDomainMask, YES) objectAtIndex:0]; 
NSString* thisImage = [documentsPath stringByAppendingPathComponent:image_path]; 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:thisImage]; 

if (fileExists){ 
    hotel_image = [UIImage imageNamed:image_path]; 
}else{ 
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"]; 
} 

Vous pouvez supposer que "image_path" est égal à "images/hotels/thishotel.jpg". Maintenant, d'abord, pour que tout le monde comprenne, "hdrHotels.jpg" se trouve dans le répertoire de base. Et "images/hotels/thishotel.jpg" sont des sous-répertoires réels (folers bleus). J'ai aussi essayé d'utiliser:

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *imagePath = [NSString stringWithFormat:@"/%@",image_path]; 
NSString* thisImage = [documentsPath stringByAppendingPathComponent:imagePath]; 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:thisImage]; 

Ajout d'un leader "/" devant "images/hôtels/thishotel.jpg". Ce qui se passe dans ces deux cas est que l'instruction "if" est fausse, que l'image existe ou non. Je ne suis pas sûr de ce que je fais de mal du tout. Toute aide serait grandement appréciée.

EDIT:

J'ai changé:

NSString *imagePath = [NSString stringWithFormat:@"/%@",image_path]; 

à:

NSString *imagePath = [image_path stringByReplacingOccurrencesOfString:@"images/hotels/" withString:@""]; 

Mais cela ne fonctionnait toujours pas.

J'ai essayé aussi:

NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString* documentsDir = [paths objectAtIndex:0]; 
NSString* myFilePath = [NSString stringWithFormat:@"%@/%@", documentsDir, image_path]; 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myFilePath]; 

sans chance.

---------------------------------- RÉPONSE --------- -----------------------

Alors oui, j'ai finalement compris. Je ne peux pas répondre à ma propre question car je n'ai pas encore 100 représentants, mais voici la solution.

NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSString *myFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:image_path]; 

BOOL fileExists = [fileManager fileExistsAtPath:myFilePath]; 

if (fileExists){ 
    hotel_image = [UIImage imageNamed:image_path]; 
}else{ 
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"]; 
} 

Répondre

0

maintenant que je vois à nouveau je peux enfin répondre:

NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSString *myFilePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:image_path]; 

BOOL fileExists = [fileManager fileExistsAtPath:myFilePath]; 

if (fileExists){ 
    hotel_image = [UIImage imageNamed:image_path]; 
}else{ 
    hotel_image = [UIImage imageNamed:@"hdrHotels.jpg"]; 
} 
0

Si vous voulez dire que « les sous-répertoires réels (dossiers bleus) » et « répertoire de base », comme les répertoires dans Xcode, alors tous les fichiers seront placés dans le chemin du faisceau et non pas dans le répertoire des documents. À la place, les fichiers du répertoire de documents sont des fichiers qui ont été générés, copiés ou téléchargés directement par l'application pendant l'exécution.

+0

Eh bien le "hotel_image = [UIImage imageNamed: image_path];" est utilisé plus tard pour appeler l'image.Donc, il a inclus les "images/hôtels /" ainsi que le nom de l'image. Mais dites-vous que pour vérifier si l'image est là, je devrais la réduire au nom de l'image? – James

+0

si le fichier img est inclus dans votre ensemble de projets, vous n'avez pas besoin d'un chemin sur [UIImage imageNamed:]. Juste le nom du fichier image. Vous pouvez vérifier si l'image est dans votre bundle en vérifiant les projets Target/Build Phase/Copy Bundle Resources. Si le fichier est dans cette liste, vous n'avez pas besoin d'un composant de chemin –

+0

Oui, imageNamed fonctionne sur les noms et non sur les fichiers. Donc, il vérifie initialement dans le cache de l'image. S'il n'est pas trouvé, il cherchera dans l'ensemble de l'application. Si vous souhaitez obtenir une image à partir d'un chemin, vous devez utiliser imageWithContentsOfFile: Envisagez imageNamed: comme méthode pratique pour rechercher facilement les images que vous avez déjà placées dans l'ensemble et que vous souhaitez utiliser comme ressources. En plus de iOS4, vous n'êtes pas obligé de spécifier l'extension de l'image aussi (c'est nécessaire dans iOS <4) – viggio24

0

Ajout d'un leader/à IMAGE_PATH, puis en ajoutant que les résultats documentPath dans « DOCDIR // imagePath », le système de fichiers traite cela comme « DOCDIR/imagePath ». Comme suggéré viggio24, d'abord rechercher vos images dans le resourceRes, puis dans le docDir.

+0

Je sais, mais je testais juste au cas où. Je suis complètement nouveau à la programmation pour l'iPhone, ou dans tout type de langage C, d'ailleurs. – James

0

Voici quatre façons différentes (chemin temporaire/personnalisé, un dossier Fagot, dossier de documents et une autre forme d'accès aux documents du dossier)

// Temporary Path Folder (read/write files) 
// 
NSMutableString *tempPathFile = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024]; 
[tempPathFile setString:[NSTemporaryDirectory() stringByAppendingPathComponent:@"export.mov"]]; 


// Application Folder (read-only files) 
// 
NSString *systemDirectoryPath = [[NSString alloc] initWithString:[[NSBundle mainBundle] resourcePath]]; 


// Documents Folder (read/write files) 
// 
NSArray *filePaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [[NSString alloc] initWithString:[filePaths objectAtIndex:0]]; 


// Another way to access Documents Folder (read/write files) 
// 
NSMutableString *documentsPath = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024]; 
[documentsPath setString:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]]; 

pas certains de ce qui se passe dans le reste de votre code, mais la autorelease de certains des appels de classe peut vous obtenir donc j'alloc généralement une chaîne mutable pour ma propre copie des chemins de dossier

+0

Donc, avec le dossier d'application, si l'image faisait partie de l'ensemble (ai-je raison de supposer que c'est ce que vous voulez dire?), Aurais-je besoin de supprimer la variable image_path des images/hôtels? – James

+0

oui, vous n'avez pas à spécifier le chemin de tout élément inclus dans le bundle. juste le nom du fichier image est tout ce dont vous avez besoin et l'extension est optionnelle aussi. –