Строковые представления путей к файлам

NSString обеспечивает богатый набор методов для управления строками как пути файловой системы. Можно извлечь каталог пути, имя файла, и расширение, развернуть выражение тильды (такой как “~me”), или создают один для корневого каталога пользователя и очищают пути, содержащие символьные ссылки, избыточные наклонные черты и ссылки на (текущий каталог) и «..» (родительский каталог).

Представление пути

NSString представляет пути в общем с ‘/’ как разделитель пути и'.' как дополнительный разделитель. Методы, принимающие строки как параметры пути, преобразовывают эти универсальные представления надлежащей специфичной для системы форме по мере необходимости. В системах с неявным корневым каталогом абсолютные пути начинаются с разделителя пути или с выражением тильды (“~/...” или “~user/...”). Где устройство должно быть указано, можно сделать это сами — представление системной зависимости — или позволить строковому объекту добавить устройство по умолчанию.

Можно создать стандартизированное представление использования пути stringByStandardizingPath. Это выполняет много задач включая:

например:

NSString *path = @"/usr/bin/./grep";
NSString *standardizedPath = [path stringByStandardizingPath];
// standardizedPath: /usr/bin/grep
 
path = @"~me";
standardizedPath = [path stringByStandardizingPath];
// standardizedPath (assuming conventional naming scheme): /Users/Me
 
path = @"/usr/include/objc/..";
standardizedPath = [path stringByStandardizingPath];
// standardizedPath: /usr/include
 
path = @"/private/usr/include";
standardizedPath = [path stringByStandardizingPath];
// standardizedPath: /usr/include

Пользовательские каталоги

Следующие примеры иллюстрируют, как можно использовать NSStringутилиты пути и другое Какао функционируют для получения пользовательских каталогов.

// Assuming that users’ home directories are stored in /Users
 
NSString *meHome = [@"~me" stringByExpandingTildeInPath];
// meHome = @"/Users/me"
 
NSString *mePublic = [@"~me/Public" stringByExpandingTildeInPath];
// mePublic = @"/Users/me/Public"

Можно найти корневой каталог для текущего пользователя и для данного пользователя с NSHomeDirectory и NSHomeDirectoryForUser соответственно:

NSString *currentUserHomeDirectory = NSHomeDirectory();
NSString *meHomeDirectory = NSHomeDirectoryForUser(@"me");

Обратите внимание на то, что необходимо обычно использовать функцию NSSearchPathForDirectoriesInDomains определять местоположение стандартных каталогов для текущего пользователя. Например, вместо:

NSString *documentsDirectory =
                [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

необходимо использовать:

NSString *documentsDirectory;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([paths count] > 0) {
    documentsDirectory = [paths objectAtIndex:0];
}

Компоненты контура

NSString обеспечивает богатый набор методов для управления строками, поскольку файловая система соединяет каналом, например:

pathExtensionРасширение пути, если таковые имеются, строки, столь же интерпретируемой как путь. (только для чтения)
stringByDeletingPathExtensionНовая строка, сделанная путем удаления расширения (если таковые имеются, и только последнее) от получателя. (только для чтения)
stringByDeletingLastPathComponentНовая строка, сделанная путем удаления последнего компонента контура из получателя, вместе с любым заключительным разделителем пути. (только для чтения)

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

NSString *documentPath = @"~me/Public/Demo/readme.txt";
 
NSString *documentDirectory = [documentPath stringByDeletingLastPathComponent];
// documentDirectory = @"~me/Public/Demo"
 
NSString *documentFilename = [documentPath lastPathComponent];
// documentFilename = @"readme.txt"
 
NSString *documentExtension = [documentPath pathExtension];
// documentExtension = @"txt"

Завершение имени файла

Можно найти возможные расширения использования имен файлов completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:. Например, учитывая каталог ~/Demo это содержит следующие файлы:

ReadMe.txt readme.html readme.rtf recondite.txt test.txt

можно найти все возможные завершения для пути ~/Demo/r следующим образом:

NSString *partialPath = @"~/Demo/r";
NSString *longestCompletion;
NSArray *outputArray;
 
unsigned allMatches = [partialPath completePathIntoString:&longestCompletion
    caseSensitive:NO
    matchesIntoArray:&outputArray
    filterTypes:nil];
 
// allMatches = 3
// longestCompletion = @"~/Demo/re"
// outputArray = (@"~/Demo/readme.html", "~/Demo/readme.rtf", "~/Demo/recondite.txt")

Можно найти возможные завершения для пути ~/Demo/r это имеет расширение «.txt» или «.rtf» следующим образом:

NSArray *filterTypes = @[@"txt", @"rtf"];
 
unsigned textMatches = [partialPath completePathIntoString:&outputName
    caseSensitive:NO
    matchesIntoArray:&outputArray
    filterTypes:filterTypes];
// allMatches = 2
// longestCompletion = @"~/Demo/re"
// outputArray = (@"~/Demo/readme.rtf", @"~/Demo/recondite.txt")