[iOS] gestion des fichiers

mercredi 15 juillet 2015
Il faut savoir que sous Xcode, il n’est pas possible d’écrire ou modifier des fichiers n’importe où dans votre projet. Il n’est possible d’écrire ou modifier des fichiers que dans la sandbox de votre application. Donc si vous embarquez un fichier dans votre projet que vous souhaitez modifier par l’application, il est obligatoire de le copier dans votre sandbox au lancement de votre application. Bien sûr, il est nécessaire de le faire qu’une seul fois. Par contre, si le fichier dans votre projet ne sert qu’à de la consultation pas nécessaire de le déplacer dans la sandbox. Donc au démarrage de l’application:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //SAVE PLIST PREFERENCE FILE
    NSString *sourcepath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"csv"];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *destinationpath = [documentsDirectory stringByAppendingPathComponent:@"users.csv"];   
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:destinationpath];
    if(!fileExists){
        NSData *fileData = [[NSData alloc] initWithContentsOfFile:sourcepath];
        [fileData writeToFile:destinationpath atomically:YES];
        //NSLog(@"EXISTS NOW:%@ IN %@",[[NSFileManager defaultManager] fileExistsAtPath:destinationpath] ? @"YES" : @"NO",destinationpath);
    }
}
Cette fonction permet de copier le fichier depuis votre projet dans la sandbox. Maintenant, le fichier peut être modifié / supprimé car il se trouve dans votre sandbox. Exemple de modification du fichier:
// CREATE ROW TO INSERT IN CSV
NSDateFormatter *DateFormatter=[[NSDateFormatter alloc] init];
[DateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];
NSString *resultline = [NSString stringWithFormat:@"%@;%@;%@;%@;%@",language,textfield_lastname.text,textfield_firstname.text,textfield_email.text,[DateFormatter stringFromDate:[NSDate date]]];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *destinationpath = [documentsDirectory stringByAppendingPathComponent:@"users.csv"];   
NSString *fileContent = [NSString stringWithContentsOfFile:destinationpath encoding:NSUTF8StringEncoding error:nil];
NSString *newContent = [NSString stringWithFormat:@"%@\n%@",fileContent,resultline];
[newContent writeToFile:destinationpath atomically:YES encoding:NSUTF8StringEncoding error:nil];
Dans cet exemple, on ajoute une row dans le csv avec la date / heure du jour. Ensuite on reprend le contenu du fichier existant et on y rajoute la nouvelle row, ensuite il ne reste plus qu’à écraser le fichier toujours dans la sandbox.

Tags: csv , fichier , sandbox , writeToFile , Xcode