Как открыть файл кросс-платформенным способом, используя filesystem :: path?

Допустим, вы использовали новый код 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 ?

  1. ../backup: нет такого файла или каталога
  2. 2012-12-01 2013-01-08 2013-01-27
  3. 2012-12-01/2013-01-08/2013-01-27/
  4. исходный pnas_final pnas_sub код>

Решение

  1. Нет: там есть каталог backup в /Users .
  2. Нет: это содержимое Users/thing/backup , но с .. мы просили на один уровень выше.
  3. Нет: см. предыдущее объяснение. Кроме того, мы не указали -F для отображения / в конце имен каталогов.
  4. Да: ../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 .

  • Относительные пути указывают местоположение, начиная с текущего местоположения, а абсолютные пути указывают местоположение из корня файловой системы.

Оцените статью
logicle.ru
Добавить комментарий