Полное имя файла состоит из пути к папке, содержащей файл, и собственно имени файла, которое может включать расширение (часть имени после точки). Расширение файла не определяет формат содержания файла, а подсказывает пользователю или ОС, с помощью какой программы можно просмотреть или отредактировать данный файл. Например, файлы .docx нужно открывать в Word, но формально являются архивами zip, что можно проверить, изменив расширение файла.
Имена папок в пути разделяются в Unix/Linux с помощью ``/``, в Windows с помощью ``/`` или ``\`` (который нужно удваивать в строках C!). В обоих семействах ОС имя ``.`` является обозначением для текущей папки, ``..`` -- для родительской папки. В Unix/Linux корневая папка обозначается ``/``, в Windows дополнительно перед ``\`` указывается имя устройства (``C:``) или имя сервера (``\\SERVER``). Если полное имя файла начинается не с корневой папки (абсолютный путь), то поиск файла выполняется от текущей (рабочей) папки (относительный путь).
``C:/Users/petrov/Downloads/picture.jpg`` -- абсолютный путь\
``C:\Users\petrov\Downloads\picture.jpg`` -- тот же файл\
``picture.jpg`` -- тот же файл, если текущая папка ``C:\Users\petrov\Downloads``\
``./picture.jpg`` -- относительный путь для той же текущей папки\
``Downloads/picture.jpg`` -- относительный путь, если текущая папка ``C:\Users\petrov``\
``..\..\petrov\Downloads\picture.jpg`` -- относительный путь, если текущая папка ``C:\Users\ivanov\Documents``
В Windows регистр букв в имени файлов не важен, но в Unix/Linux является существенным, поэтому в программах нужно писать имена файлов, учитывая регистр, а в Linux не давать файлам имена, отличающиеся только регистром. Также рекомендуется использовать относительные пути, чтобы пользователь мог размещать программу в любой папке, и ``/`` для разделения имен папок.
В стандарт С++17 была добавлена библиотека filesystem из boost. Классы и функции объявлены в заголовочном файле ``<filesystem>`` в пространстве имен ``std::filesystem``. Для имени файла или папки используется специальный класс ``path``, но работает автоматическое преобразование из ``string`` и ``char[]``:\
``path name="c:/temp/sample.txt", from, to;``\
У данного класса есть методы, позволяющие получить путь до файла (папки), имя и расширение, операция ``/`` для соединения двух путей.
В стандарте С операции с файловой системой ограничены некоторыми действиями с файлами (удаление, переименование, создание временных файлов) и объявлены в ``<stdio.h>``.
Многие компиляторы поддерживают функции стандарта [POSIX](https://pubs.opengroup.org/onlinepubs/9699919799/nframe.html), который обеспечивает совместимость между разными версиями Unix/Linux, но так как эти компиляторы есть и в Windows, это позволяет использовать их для переносимого кода. Большинство функций объявлены в ``<unistd.h>`` и ``<sys/stat.h>``
Также напрямую можно использовать API операционной системы, но использование программы будет ограничено только ей. В Windows нужно подключить ``<windows.h>``. Функции имеют окончание A при использовании кодировки ANSI (CP1251) для имен файлов и папок и W для Unicode.
Имя файла в C и Windows API задается как строка:\
``char name[100]="c:\\temp\\sample.txt", from[100], to[100];``
В качестве аргумента всем функциям можно указать не только массив символов или path, но строковую константу в кавычках.