Управление файлами и каталогами

Некоторые самые основные операции, включающие файлы и каталоги, создают их и перемещают их вокруг файловой системы. Эти операции - то, как Ваше приложение создает структуру файловой системы, это должно выполнить свои задачи. Для большинства операций, NSFileManager класс должен предложить функциональность, необходимо создать и управлять файлами. В редких случаях, где это не делает, необходимо использовать функции уровня BSD непосредственно.

Создание новых файлов и каталогов программно

Создание файлов и каталогов является базовой деталью управления файлами. Как правило, Вы создаете пользовательские каталоги для организации файлов, создаваемых кодом. Например, Вы могли бы создать некоторые пользовательские каталоги в своем приложении Application Support каталог для хранения любых частных файлов данных, которыми управляет приложение. И существует много способов создать файлы.

Создание каталогов

Когда Вы хотите создать пользовательский каталог, Вы делаете настолько использующий методы NSFileManager. Процесс может создать каталоги где угодно, он имеет разрешение для этого, которое всегда включает текущий корневой каталог и может включать другие местоположения файловой системы также. Вы указываете каталог для создания путем создания пути к нему и передачи Вашего NSURL или NSString возразите против одного из следующих методов:

Перечисление 6-1 показывает, как создать пользовательский каталог для файлов приложения в ~/Library/Application Support каталог. Этот метод создает каталог, если это не существует и возвращает путь к каталогу к коду вызова. Поскольку этот метод касается файловой системы каждый раз, когда Вы не хотели бы вызывать этот метод неоднократно для получения URL. Вместо этого Вы могли бы вызвать его один раз и затем кэшировать возвращенный URL.

Перечисление 6-1  , Создающее пользовательский каталог для файлов приложения

- (NSURL*)applicationDirectory
{
    NSString* bundleID = [[NSBundle mainBundle] bundleIdentifier];
    NSFileManager*fm = [NSFileManager defaultManager];
    NSURL*    dirPath = nil;
 
    // Find the application support directory in the home directory.
    NSArray* appSupportDir = [fm URLsForDirectory:NSApplicationSupportDirectory
                                    inDomains:NSUserDomainMask];
    if ([appSupportDir count] > 0)
    {
        // Append the bundle ID to the URL for the
        // Application Support directory
        dirPath = [[appSupportDir objectAtIndex:0] URLByAppendingPathComponent:bundleID];
 
        // If the directory does not exist, this method creates it.
        // This method is only available in OS X v10.7 and iOS 5.0 or later.
        NSError*    theError = nil;
        if (![fm createDirectoryAtURL:dirPath withIntermediateDirectories:YES
                   attributes:nil error:&theError])
        {
            // Handle the error.
 
            return nil;
        }
    }
 
    return dirPath;
}

Если Ваш код должен работать в OS X v10.6 и ранее, можно заменить любые вызовы к createDirectoryAtURL:withIntermediateDirectories:attributes:error: метод с подобным вызовом к createDirectoryAtPath:withIntermediateDirectories:attributes:error: метод. Единственное изменение, которое необходимо внести, должно передать основанный на операция со строками путь вместо URL как первый параметр. Однако NSURL класс определяет a path метод, возвращающий основанную на операция со строками версию его пути.

NSFileManager методы являются предпочтительным способом создать новые каталоги из-за их простоты. Однако можно также использовать mkdir функция для создания каталогов самостоятельно. Если Вы делаете так, Вы ответственны за создание промежуточных каталогов и обработку любых происходящих ошибок.

Создание новых файлов

Существует две части к созданию файла: создание записи для файла в файловой системе и заполнении файла с содержанием. Все высокоуровневые интерфейсы для создания файлов выполняют обе задачи одновременно, обычно заполняя файл содержанием NSData или NSString возразите и затем закрытие файла. Можно также использовать функции низшего уровня, чтобы создать пустой файл и получить дескриптор файла, который можно тогда использовать для заполнения файла данными. Некоторые подпрограммы, которые можно использовать для создания файлов:

При записи содержания нового файла одновременно, системные подпрограммы обычно близко файл после записи содержания к диску. Если подпрограмма возвращает дескриптор файла, можно использовать тот дескриптор, чтобы продолжать читать и писать из файла. Для получения информации о том, как считать и записать содержание файла, видит Методы для Чтения и Записи Файлов Без Координаторов Файла.

Копирование и движущиеся файлы и каталоги

Скопировать элементы вокруг файловой системы, NSFileManager класс обеспечивает copyItemAtURL:toURL:error: и copyItemAtPath:toPath:error: методы. Перемещать использование файлов moveItemAtURL:toURL:error: или moveItemAtPath:toPath:error: методы.

Предыдущие методы перемещают или копируют единственный файл или каталог за один раз. При перемещении или копировании каталога, затронуты каталог и все его содержание. Семантика для перемещения и операций копии совпадает с в Средстве поиска. Операции пересылки на том же объеме не заставляют новую версию элемента создаваться. Операции пересылки между объемами ведут себя то же как работа копии. И при перемещении или копировании элементов, текущий процесс должен иметь разрешение считать элементы и переместить или скопировать их в новое расположение.

Переместите и скопируйте операции, может потенциально занять много времени для завершения, и NSFileManager класс выполняет эти операции синхронно. Поэтому рекомендуется выполнить любые такие операции на параллельной очереди отгрузки а не на основном потоке приложения. Перечисление 6-2 показывает пример, делающий просто это путем асинхронного создания резервного копирования частных данных вымышленного приложения. (Ради примера частные данные расположены в ~/Library/Application Support/bundleID/Data каталог, где bundleID является фактическим идентификатором пакета приложения.), Если первая попытка скопировать сбои каталога, этот метод проверки, чтобы видеть, существует ли предыдущее резервное копирование и удаляет его, если это делает. Это тогда продолжается, чтобы попробовать еще раз и аварийные прекращения работы, если это перестало работать во второй раз.

Перечисление 6-2  , Копирующее каталог асинхронно

- (void)backupMyApplicationData {
   // Get the application's main data directory
   NSArray* theDirs = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                 inDomains:NSUserDomainMask];
   if ([theDirs count] > 0)
   {
      // Build a path to ~/Library/Application Support/<bundle_ID>/Data
      // where <bundleID> is the actual bundle ID of the application.
      NSURL* appSupportDir = (NSURL*)[theDirs objectAtIndex:0];
      NSString* appBundleID = [[NSBundle mainBundle] bundleIdentifier];
      NSURL* appDataDir = [[appSupportDir URLByAppendingPathComponent:appBundleID]
                               URLByAppendingPathComponent:@"Data"];
 
      // Copy the data to ~/Library/Application Support/<bundle_ID>/Data.backup
      NSURL* backupDir = [appDataDir URLByAppendingPathExtension:@"backup"];
 
      // Perform the copy asynchronously.
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         // It's good habit to alloc/init the file manager for move/copy operations,
         // just in case you decide to add a delegate later.
         NSFileManager* theFM = [[NSFileManager alloc] init];
         NSError* anError;
 
         // Just try to copy the directory.
         if (![theFM copyItemAtURL:appDataDir toURL:backupDir error:&anError]) {
            // If an error occurs, it's probably because a previous backup directory
            // already exists.  Delete the old directory and try again.
            if ([theFM removeItemAtURL:backupDir error:&anError]) {
               // If the operation failed again, abort for real.
               if (![theFM copyItemAtURL:appDataDir toURL:backupDir error:&anError]) {
                  // Report the error....
               }
            }
         }
 
      });
   }
}

Для получения дополнительной информации о том, как использовать NSFileManager методы, посмотрите Ссылку класса NSFileManager.

Удаление файлов и каталогов

Для удаления файлов и каталогов используйте следующие методы NSFileManager класс:

При использовании этих методов для удаления файлов поймите постоянное удаление файлов из файловой системы; эти методы не перемещают файл в Мусор, где это может быть восстановлено позже.

Для получения дополнительной информации о том, как использовать NSFileManager методы, посмотрите Ссылку класса NSFileManager.

Создание и обработка невидимых файлов

В OS X Вы делаете файл невидимым для пользователя путем предварительного ожидания его имени с символом точки. Добавление этого кодовые комбинации к Средству поиска и другим связанным с дисплеем интерфейсам, что они должны обработать файл как невидимый под нормальными условиями. Необходимо использовать эту возможность экономно, тем не менее, и только в очень конкретных случаях. Например, процесс для локализации пользовательского имени каталога связал помещающие скрытые файлы с локализованными именами на верхнем уровне каталога. Вы никогда не должны использовать этот метод для сокрытия пользовательских документов или других данных, которые создает приложение.

Даже если Вы отмечаете файл как невидимый, существуют все еще способы для пользователя видеть его. Пользователи могут всегда просматривать истинное содержимое файловой системы с помощью Терминального приложения. В отличие от Средства поиска, командная строка в Окне терминала выводит на экран подлинные имена элементов в файловой системе и не их именах дисплея или локализованных именах. Можно также показать скрытые файлы в открытую и панели Save (использующий setShowsHiddenFiles: метод) в случаях, где Вы хотите, чтобы пользователь был в состоянии выбрать их для просмотра или редактирования.

Независимо от того, содержит ли файл ведущий период, код Вашего приложения может всегда видеть скрытые файлы. Методы, перечисляющие содержание каталогов обычно, включают скрытые файлы в перечисление. Единственные исключения к этому правилу являются meta каталогами . и .. это представляет текущие и родительские каталоги. Поэтому любой код, перечисляющий содержание каталога, должен быть подготовлен обработать скрытые файлы и соглашение с ними соответственно, обычно просто игнорируя их.