Строковые представления путей к файлам
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") |