Получите имя файла от дескриптора файла в C

можно достигнуть той же функциональности, позволив элементам наследовать несколько стилей.напр.

<p class="style1 style2">stuff</p>

и затем Ваш css включал бы, например:

.style1 {width:140px;}
.style2 {height:140px;}

редактирование: на самом деле ответ robert мог бы лучше приблизить метод, которого Вы пытаетесь достигнуть

.style1, .style2 {width: 140px;}
.style2 {height: 140px;}

<p class="style2">i will have both width and height applied</p>
97
задан jww 19 March 2019 в 06:52
поделиться

6 ответов

Вы можете использовать readlink в / proc / self / fd / NNN где NNN - дескриптор файла. Это даст вам имя файла, которое было при его открытии - однако, если файл был перемещен или удален с тех пор, он может больше не быть точным (хотя Linux может отслеживать переименования в некоторых случаях). Чтобы проверить, stat имя файла и fstat fd, который у вас есть, и убедитесь, что st_dev и st_ino совпадают.

] Конечно, не все файловые дескрипторы относятся к файлам, и для них вы увидите некоторые нечетные текстовые строки, такие как pipe: [1538488] . Поскольку все настоящие имена файлов будут абсолютными путями, вы можете легко определить, какие из них. Кроме того, как отмечали другие, файлы могут иметь несколько жестких ссылок, указывающих на них - это будет сообщать только о той, с которой он был открыт. Если вы хотите найти все имена для данного файла, вам просто нужно просмотреть всю файловую систему.

stat имя файла и fstat fd, который у вас есть, и убедитесь, что st_dev и st_ino совпадают.

Конечно же. , не все файловые дескрипторы относятся к файлам, и для них вы увидите некоторые нечетные текстовые строки, такие как pipe: [1538488] . Поскольку все настоящие имена файлов будут абсолютными путями, вы можете легко определить, какие из них. Кроме того, как отмечали другие, файлы могут иметь несколько жестких ссылок, указывающих на них - это будет сообщать только о той, с которой он был открыт. Если вы хотите найти все имена для данного файла, вам просто нужно просмотреть всю файловую систему.

stat имя файла и fstat fd, который у вас есть, и убедитесь, что st_dev и st_ino совпадают.

Конечно же. , не все файловые дескрипторы относятся к файлам, и для них вы увидите некоторые нечетные текстовые строки, такие как pipe: [1538488] . Поскольку все настоящие имена файлов будут абсолютными путями, вы можете легко определить, какие из них. Кроме того, как отмечали другие, файлы могут иметь несколько жестких ссылок, указывающих на них - это будет сообщать только о той, с которой они были открыты. Если вы хотите найти все имена для данного файла, вам просто нужно просмотреть всю файловую систему.

не все файловые дескрипторы относятся к файлам, и для них вы увидите некоторые нечетные текстовые строки, такие как pipe: [1538488] . Поскольку все настоящие имена файлов будут абсолютными путями, вы можете легко определить, какие из них. Кроме того, как отмечали другие, файлы могут иметь несколько жестких ссылок, указывающих на них - это будет сообщать только о той, с которой он был открыт. Если вы хотите найти все имена для данного файла, вам просто нужно просмотреть всю файловую систему.

не все файловые дескрипторы относятся к файлам, и для них вы увидите некоторые нечетные текстовые строки, такие как pipe: [1538488] . Поскольку все настоящие имена файлов будут абсолютными путями, вы можете легко определить, какие из них. Кроме того, как отмечали другие, файлы могут иметь несколько жестких ссылок, указывающих на них - это будет сообщать только о той, с которой они были открыты. Если вы хотите найти все имена для данного файла, вам просто нужно просмотреть всю файловую систему.

111
ответ дан 24 November 2019 в 05:22
поделиться

В Windows с помощью GetFileInformationByHandleEx , передавая FileNameInfo , вы можете получить имя файла.

23
ответ дан 24 November 2019 в 05:22
поделиться

Вы можете использовать fstat (), чтобы получить индексный дескриптор файла с помощью struct stat. Затем, используя readdir (), вы можете сравнить найденный inode с теми, которые существуют (struct dirent) в каталоге (при условии, что вы знаете каталог, иначе вам придется искать по всей файловой системе) и найти соответствующее имя файла. Противно?

6
ответ дан 24 November 2019 в 05:22
поделиться

Как указывает Тайлер, нет способа сделать то, что вам нужно, «напрямую и надежно», поскольку данный FD может соответствовать 0 имен файлов (в различных случаях) или> 1 (несколько «жестких» ссылки », как обычно описывается последняя ситуация). Если вам все еще нужна функциональность со всеми ограничениями (по скорости И по возможности получения результатов 0, 2, ..., а не 1), вот как вы можете это сделать: во-первых, fstat FD - в итоговой структуре struct stat он сообщает вам, на каком устройстве находится файл, сколько жестких ссылок у него есть, является ли это специальным файлом и т. Д. Это может уже ответить на ваш вопрос - например, если 0 жестких ссылок, вы ЗНАЕТЕ, что на самом деле нет соответствующего имени файла на диске.

Если статистика дает вам надежду, тогда вам нужно "

15
ответ дан 24 November 2019 в 05:22
поделиться

Прежде чем списать это на невозможное, я предлагаю вам взглянуть на исходный код команды lsof .

Могут быть ограничения, но lsof, похоже, способен определить файл дескриптор и имя файла. Эта информация существует в файловой системе / proc, поэтому ее можно будет получить из вашей программы.

8
ответ дан 24 November 2019 в 05:22
поделиться

Невозможно. Файловый дескриптор может иметь несколько имен в файловой системе или вообще не иметь имени.

Изменить: Предполагая, что вы говорите о простой старой системе POSIX без каких-либо специфичных для ОС API, поскольку вы не указали ОС.

2
ответ дан 24 November 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: