Допустим, вы использовали новый код std :: filesystem
(или std :: experimental :: filesystem
) для поиска файла. . У вас есть переменная path
, которая содержит полный путь к этой переменной.
Как открыть этот файл?
Это может звучит глупо, но рассмотрите очевидный ответ:
std :: filesystem :: path my_path = ...; std :: ifstream stream (my_path.c_str (), std: : ios :: binary);
Это не гарантированно сработает. Почему? Потому что, например, в Windows path :: string_type
— это std :: wstring
. Итак, path :: c_str
вернет const wchar_t *
. А std :: ifstream
может только принимать пути с типом const char *
.
Теперь выясняется, что этот код действительно будет работать в VS. Почему? Поскольку в Visual Studio есть расширение библиотеки, которое позволяет этому работать. Но это нестандартное поведение и поэтому не может быть переносимым . Например, я понятия не имею, предоставляет ли GCC в Windows ту же функцию.
Вы можете попробовать это:
std :: filesystem :: path my_path = ...; std :: ifstream stream (my_path.string (). c_str (), std :: ios :: binary);
Только Windows снова нас смущает . Потому что, если my_path
содержит символы Unicode, то теперь вы полагаетесь на правильную настройку локали Windows ANSI. И даже это не обязательно спасет вас, если в пути есть символы из нескольких языков, которые не могут существовать в одной и той же локали ANSI.
Boost Filesystem действительно имела аналогичную проблему. Но они расширили свою версию iostreams, чтобы напрямую поддерживать path
.
Я что-то упустил? Добавил ли комитет кроссплатформенную библиотеку файловой системы, не добавляя кроссплатформенный способ открывать файлы в ней?
указал Бо Перссон. что это предмет стандартного отчета о дефектах библиотеки. Этот дефект был устранен, и C ++ 17 будет поставляться, требуя реализации, где path :: value_type
не является char
, чтобы их типы потоков файлов принимали const filesystem path :: value_type *
в дополнение к обычным версиям const char *
.
Навигация по файлам и каталогам
Обзор
Преподавание: 30 мин
Упражнения: 20 минВопросы
Как я могу выполнять операции с файлами вне моего рабочего каталога ?
Какие ярлыки навигации я могу использовать, чтобы повысить эффективность своей работы?
Цели
Используйте одна команда для навигации по нескольким шагам в структуре каталогов, включая перемещение назад (на один уровень вверх).
Выполнять операции с файлами в каталогах за пределами вашего рабочего каталога.
Работа со скрытыми каталоги и скрытые файлы.
Преобразование между абсолютными и относительными путями.
Использование навигации ярлыки для перемещения по файловой системе.
Перемещение по файловой системе
Мы узнали, как использовать pwd
, чтобы найти наше текущее местоположение в нашей файловой системе. Мы также узнали, как использовать cd
для изменения местоположения и ls
для вывода списка содержимого каталога. Теперь мы собираемся изучить некоторые дополнительные команды для перемещения в нашей файловой системе.
Используйте команды, которые мы изучили до сих пор, для перехода к shell_data/untrimmed_fastq
, если вас еще нет.
$ cd $ cd shell_data $ cd untrimmed_fastq
Что, если мы захотим вернуться и выйти из этого каталога в наш каталог верхнего уровня? Можем ли мы ввести cd shell_data
? Попробуйте и посмотрите, что произойдет.
$ cd shell_data
-bash: cd: shell_data: нет такого файла или каталога
Ваш компьютер искал каталог или файл с именем shell_data
в каталоге, в котором вы уже находились. Он не знал, что вы хотите посмотреть на уровень каталога выше того, в котором находились.
У нас есть специальная команда, которая сообщает компьютеру, чтобы он переместил нас назад или вверх на один уровень каталога.
$ cd ..
Теперь мы можем использовать pwd
, чтобы убедиться, что мы находимся в каталоге мы намеревались перейти к и ls
, чтобы проверить правильность содержимого каталога.
$ pwd
/home/dcuser/shell_data
$ ls
sra_meta data untrimmed_fastq
Из этого вывода мы видим, что ..
действительно вернул нас на один уровень назад наша файловая система.
Вы можете связать их вместе следующим образом:
$ ls ../ ../
печатает содержимое /home
.
Поиск скрытых каталогов
Сначала перейдите в каталог
shell_data
. В этом каталоге есть скрытый каталог. Изучите параметры дляls
, чтобы узнать, как увидеть скрытые каталоги. Перечислите содержимое каталога и укажите имя текстового файла в этом каталоге.Совет: скрытые файлы и папки в Unix начинаются с
.
, например.. my_hidden_directory
Решение
Сначала используйте команду
man
, чтобы просмотреть параметры дляls
.$ man ls
Параметр
-a
является сокращением отall
и говорит, что он вызываетls
«Не игнорировать, начиная с». Это тот вариант, который нам нужен.$ ls -a
. .. .hidden sra_metadata untrimmed_fastq
Имя скрытого каталога —
.hidden
. Мы можем перейти в этот каталог с помощьюcd
.$ cd .hidden
А затем вывести список содержимого каталога с помощью
ls
.$ ls
youfoundit. txt
Имя текстового файла —
youfoundit.txt
.
В большинстве команд флаги можно комбинировать в произвольном порядке для получения желаемых результатов/вывода.
$ ls -Fa $ ls -laF
Проверка содержимого других каталогов
По умолчанию , команды ls
выводят список содержимого рабочего каталога (т. е. каталога, в котором вы находитесь). Вы всегда можете найти каталог, в котором находитесь, с помощью команды pwd
. Однако вы также можете передать ls
имена других каталогов для просмотра. Перейдите в свой домашний каталог, если вы еще не там.
$ cd
Затем введите команду:
$ ls shell_data
sra_metadata untrimmed_fastq
Это отобразит содержимое каталога shell_data
без необходимости перемещаться туда.
Команда cd
работает аналогичным образом.
Попробуйте ввести:
$ cd $ cd shell_data/untrimmed_fastq
Это перенесет вас в каталог untrimmed_fastq
без необходимости проходить через промежуточный каталог.
Практика навигации
Перейдите в свой домашний каталог. Оттуда перечислите содержимое каталога
untrimmed_fastq
.Решение
$ cd $ ls shell_data/untrimmed_fastq/
SRR097977.fastq SRR098026.fastq
Полный и относительный пути
Команда cd
принимает аргумент, который является именем каталога. Каталоги можно указать с помощью относительного пути или полного абсолютного пути.. Каталоги на компьютере организованы в иерархию. Полный путь сообщает вам, где находится каталог в этой иерархии. Перейдите в домашний каталог, затем введите команду pwd
.
$ cd $ pwd
Вы увидите:
/home /dcuser
Это полное имя вашего домашнего каталога. Это говорит вам, что вы находитесь в каталоге с именем dcuser
, который находится внутри каталога с именем home
, который находится внутри самого верхнего каталога в иерархии. На самой вершине иерархии находится каталог с именем /
, который обычно называется корневым каталогом . Итак, подведем итог: dcuser
— это каталог в home
, который является каталогом в /
. Подробнее о root
и home
в следующем разделе.
Теперь введите следующую команду:
$ cd/home/dcuser/shell_data/.hidden
Это переходит на несколько уровней вперед в каталог .hidden
. Теперь вернитесь в домашний каталог.
$ cd
Вы также можете перейти в каталог .hidden
, используя:
$ cd shell_data/.hidden
Эти две команды имеют одинаковый эффект, они обе переносят нас к .hidden
каталог. Первый использует абсолютный путь, давая полный адрес из домашнего каталога. Второй использует относительный путь, давая только адрес из рабочего каталога. Полный путь всегда начинается с /
. Относительный путь — нет.
Относительный путь похож на получение указаний от кого-то на улице. Они говорят вам «идите направо на знаке остановки, а затем поверните налево на главную улицу». Это отлично работает, если вы стоите там вместе, но не так хорошо, если вы пытаетесь сказать кому-то, как добраться туда из другой страны. Полный путь похож на координаты GPS. Он сообщает вам, где именно что-то находится, независимо от того, где вы сейчас находитесь.
Обычно вы можете использовать полный или относительный путь в зависимости от того, что наиболее удобно. Если мы находимся в домашнем каталоге, удобнее вводить полный путь. Если мы находимся в рабочем каталоге, удобнее вводить относительные пути, так как это требует меньшего набора текста.
Со временем вам станет легче чтобы запомнить структуру каталогов, которые вы используете, и то, как быстро перемещаться между ними.
Относительное разрешение пути
Использование файловой системы На диаграмме ниже, если
pwd
отображает/Users/thing
, что будет отображатьls ../backup
?
../backup: нет такого файла или каталога
2012-12-01 2013-01-08 2013-01-27
2012-12-01/2013-01-08/2013-01-27/
исходный pnas_final pnas_sub код>
![]()
Решение
- Нет: там есть каталог
backup
в/Users
.- Нет: это содержимое
Users/thing/backup
, но с..
мы просили на один уровень выше.- Нет: см. предыдущее объяснение. Кроме того, мы не указали
-F
для отображения/
в конце имен каталогов.- Да:
../backup
относится к/Users/backup
.
Навигационные ярлыки
Корневой каталог является каталогом самого высокого уровня в вашей файловой системе и содержит файлы, которые важны для вашего компьютера для выполнения его повседневной работы. Хотя вы будете использовать корень (/
) в начале ваших абсолютных путей, важно избегать работы с данными в этих высокоуровневых каталогах, поскольку ваши команды могут постоянно изменять файлы, которые операционная система должна функционировать. Во многих случаях попытка запуска команд в корневых
каталогах потребует специальных разрешений, которые здесь не обсуждаются, поэтому лучше избегать их и работать в вашем домашнем каталоге. Работа с home
каталогом очень распространена. Символ тильды ~
— это ярлык для вашего домашнего каталога. В нашем случае корневой
каталог находится на два уровня выше нашего home
каталога, поэтому cd
или cd ~
переведет вас в /home/dcuser
, а cd/
перенесет вас в /
. Перейдите в каталог shell_data
:
$ cd $ cd shell_data
Затем введите команду:
$ ls ~
R r_data shell_data
Это напечатает содержимое вашего домашнего каталога без необходимости вводить полный путь.
Команды cd
и cd ~
очень полезны для быстрого возврата в ваш домашний каталог. В последующих уроках мы будем использовать символ ~
, чтобы указать наш домашний каталог.
Ключевые моменты
Символы
/
,~
и..
представляют собой важные ярлыки для навигации. .Скрытые файлы и каталоги начинаются с
.
и могут быть просмотрены с помощьюls -a
.Относительные пути указывают местоположение, начиная с текущего местоположения, а абсолютные пути указывают местоположение из корня файловой системы.