Spec-Zone.ru › Tcl/Tk

file

Имя
file — Управление именами и атрибутами файлов
СИНТАКСИС
ОПИСАНИЕ
file atime имя ?время?
file attributes имя
file attributes имя ?опция?
file attributes имя ?опция значение опция значение...?
file channels ?шаблон?
file copy ?-force? ?--? исходник назначение
file copy ?-force? ?--? исходник ?исходник ...? директория назначения
file delete ?-force? ?--? ?путь ... ?
file dirname имя
file executable имя
file exists имя
file extension имя
file isdirectory имя
file isfile имя
file join имя ?имя ...?
file link ?-linktype? имя_связи ?цель?
file lstat имя переменная
file mkdir ?dir ...?
file mtime имя ?время?
file nativename имя
file normalize имя
file owned имя
file pathtype имя
file readable имя
file readlink имя
file rename ?-force? ?--? исходник назначение
file rename ?-force? ?--? исходник ?исходник ...? директория назначения
file rootname имя
file separator ?имя?
file size имя
file split имя
file stat имя переменная
file system имя
file tail имя
file tempfile ?переменная имени? ?шаблон?
file type имя
file volumes
file writable имя
ВОПРОСЫ ПЕРЕНОСИМОСТИ
Unix
Windows
ПРИМЕРЫ
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

file — Управление именами и атрибутами файлов

Синтаксис

file опцияимя ?арг арг ...?

Описание

Эта команда предоставляет несколько операций с именем или атрибутами файла. Имя — это имя файла; если оно начинается с тильды, выполняется подстановка тильды перед выполнением команды (см. справочную страницу для filename для подробностей). Опция указывает, что нужно сделать с именем файла. Любое уникальное сокращение опции допустимо. Допустимые опции:
file atime name ?time?
Возвращает строку с десятичным значением времени последнего доступа к файлу name. Если задано time, оно представляет собой время доступа, которое нужно установить для файла. Время измеряется в стандартном формате POSIX как количество секунд с момента фиксированной начальной точки времени (часто 1 января 1970 года). Если файл не существует или время доступа не может быть запрошено или установлено, генерируется ошибка. В Windows на файловых системах FAT время доступа не поддерживается.
file attributes name
file attributes name ?option?
file attributes name ?option value option value...?
Эта подкоманда возвращает или устанавливает платформенно-специфичные значения, связанные с файлом. Первый вариант возвращает список платформенно-специфичных флагов и их значений. Второй вариант возвращает значение для конкретного параметра. Третий вариант устанавливает одно или несколько значений. Значения следующие:

В Unix, -group получает или устанавливает имя группы файла. Идентификатор группы может быть передан команде, но она возвращает имя группы. -owner получает или устанавливает имя пользователя владельца файла. Команда возвращает имя владельца, но при установке владельца можно передать числовой идентификатор. -permissions устанавливает или извлекает восьмеричный код, используемый chmod(1). Эта команда также имеет ограниченную поддержку установки с использованием символьных атрибутов chmod(1) в формате [ugo]?[[+-=][rwxst],[...]], где несколько символьных атрибутов могут быть разделены запятыми (например: u+s,go-rw добавляет биты "sticky" для пользователя, удаляет права чтения и записи для группы и других). Также поддерживается упрощенная строка в стиле ls в формате rwxrwxrwx (должно быть 9 символов) (например: rwxr-xr-t эквивалентно 01755). В версиях Unix, поддерживающих флаги файлов, -readonly возвращает или устанавливает/сбрасывает атрибут только для чтения файла, то есть флаг immutability пользователя uchg для chflags(1).

В Windows, -archive возвращает или устанавливает/сбрасывает атрибут архива файла. -hidden возвращает или устанавливает/сбрасывает атрибут скрытости файла. -longname расширит каждый элемент пути до его длинной версии. Этот атрибут нельзя установить. -readonly возвращает или устанавливает/сбрасывает атрибут только для чтения файла. -shortname возвращает строку, где каждый элемент пути заменяется его короткой (8.3) версией имени. Этот атрибут нельзя установить. -system возвращает или устанавливает/сбрасывает значение атрибута системы файла.

В Mac OS X и Darwin, -creator возвращает или устанавливает тип создателя файла Finder. -hidden возвращает или устанавливает/сбрасывает атрибут скрытости файла. -readonly возвращает или устанавливает/сбрасывает атрибут только для чтения файла. -rsrclength возвращает длину ресурсного раздела файла, этот атрибут можно установить только в значение 0, что приводит к удалению ресурсного раздела из файла.

file channels ?pattern?
Если pattern не указан, возвращает список имён всех зарегистрированных открытых каналов в этом интерпретаторе. Если pattern указан, возвращаются только те имена, которые соответствуют pattern. Сопоставление определяется теми же правилами, что и для string match.
file copy ?-force? ?--? source target
file copy ?-force? ?--? source ?source ...? targetDir
Первый вариант создает копию файла или каталога source по пути target. Если target является существующим каталогом, используется второй вариант. Второй вариант создаёт копию каждого указанного файла source внутри targetDir. Если в качестве source указан каталог, содержимое каталога будет рекурсивно скопировано в targetDir. Существующие файлы не будут перезаписаны, если не указан параметр -force (в этом случае Tcl также попытается скорректировать разрешения на целевой файл или каталог, если это необходимо, чтобы выполнить копирование). При копировании в пределах одной файловой системы, file copy скопирует символические ссылки (т.е. ссылки копируются сами, а не то, на что они указывают). Попытка перезаписать непустой каталог, перезаписать каталог файлом или перезаписать файл каталогом приведёт к ошибке, даже если был указан параметр -force. Аргументы обрабатываются в указанном порядке, выполнение прекращается при первой ошибке. -- обозначает конец опций; аргумент, следующий за --, будет обрабатываться как source, даже если он начинается с -.
file delete ?-force? ?--? ?pathname ... ?
Удаляет файл или каталог, указанный каждым аргументом pathname. Непустые каталоги будут удалены только если указан параметр -force. При работе со символическими ссылками, ссылки сами будут удалены, а не объекты, на которые они указывают. Попытка удалить несуществующий файл не считается ошибкой. Попытка удалить файл только для чтения приведёт к его удалению, даже если параметр -force не указан. Если параметр -force указан для каталога, Tcl попытается изменить разрешения и переместить текущий каталог “pwd” из данного пути, если это необходимо для удаления. Аргументы обрабатываются в указанном порядке, выполнение прекращается при первой ошибке. -- обозначает конец опций; аргумент, следующий за --, будет обрабатываться как pathname, даже если он начинается с -.
file dirname name
Возвращает имя, состоящее из всех компонентов пути в name, за исключением последнего элемента. Если name является относительным именем файла и содержит только один элемент пути, возвращает “.”. Если name относится к корневому каталогу, возвращается корневой каталог. Например,
file dirname c:/

возвращает c:/.

Обратите внимание, что подстановка тильды будет выполнена только в том случае, если это необходимо для завершения команды. Например,

file dirname ~/src/foo.c

возвращает ~/src, в то время как

file dirname ~

возвращает /home (или что-то подобное).

file executable name
Возвращает 1, если файл name выполняется текущим пользователем, 0 в противном случае. В Windows, где нет атрибута "исполняемый", команда считает исполняемыми все каталоги и файлы с расширениями exe, com, cmd или bat.
file exists name
Возвращает 1, если файл name существует и текущий пользователь имеет права поиска для каталогов, ведущих к нему, 0 в противном случае.
file extension name
Возвращает все символы в name после и включая последнюю точку в последнем элементе name. Если в последнем элементе name нет точки, возвращает пустую строку.
file isdirectory name
Возвращает 1, если файл name является каталогом, 0 в противном случае.
file isfile name
Возвращает 1, если файл name является обычным файлом, 0 в противном случае.
file join name ?name ...?
Принимает одно или несколько имён файлов и объединяет их, используя правильный разделитель пути для текущей платформы. Если определённое name является относительным, оно будет присоединено к предыдущему аргументу имени файла. В противном случае все предыдущие аргументы будут отброшены, и объединение будет происходить с текущего аргумента. Например,
file join a b /foo bar

возвращает /foo/bar.

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

file link ?-linktype? linkName ?target?
Если задан только один аргумент, этот аргумент предполагается как linkName, и эта команда возвращает значение ссылки, заданной linkName (т.е. имя файла, на который она указывает). Если linkName не является ссылкой или её значение не может быть прочитано (как, например, кажется в случае жёстких ссылок, которые выглядят как обычные файлы), возвращается ошибка.

Если заданы 2 аргумента, они предполагаются как linkName и target. Если linkName уже существует или target не существует, будет возвращена ошибка. В противном случае Tcl создаёт новую ссылку под названием linkName, которая указывает на существующий объект файловой системы в target (которое также возвращается), где тип ссылки зависит от платформы (в Unix по умолчанию будет символическая ссылка). Это полезно в случае, когда пользователь хочет создать ссылку кроссплатформенно и не заботится о типе создаваемой ссылки.

Если пользователь хочет создать ссылку определённого типа только (и получить ошибку, если это невозможно по какой-либо причине), следует использовать необязательный аргумент -linktype. Допустимые значения для -linktype – “-symbolic” и “-hard”.

В Unix символические ссылки могут быть созданы для относительных путей, и эти пути должны быть относительно фактического расположения linkName (а не cwd), но на всех других платформах, где относительные ссылки не поддерживаются, целевые пути всегда преобразуются в абсолютный, нормализованный вид перед созданием ссылки (и, следовательно, относительные пути интерпретируются как относительные к cwd). Кроме того, пути “~user” всегда расширяются до абсолютной формы. При создании ссылок на файловых системах, которые либо не поддерживают ссылки вообще, либо не поддерживают запрашиваемый тип ссылки, будет возвращено сообщение об ошибке. Большинство платформ Unix поддерживают как символические, так и жёсткие ссылки (последние только для файлов). Windows поддерживает символические ссылки на каталоги и жёсткие ссылки на файлы на NTFS-томах.

file lstat name varName
Аналогично опции stat (см. ниже), но использует системный вызов lstat вместо stat. Это означает, что если name ссылается на символическую ссылку, информация, возвращённая в varName, относится к ссылке, а не к файлу, на который она ссылается. На системах, которые не поддерживают символические ссылки, эта опция ведёт себя точно так же, как опция stat.
file mkdir ?dir ...?
Создаёт каждый указанный каталог. Для каждого указанного пути dir эта команда будет создавать все несуществующие родительские каталоги, а также сам dir. Если каталог уже существует, никаких действий не предпринимается, и ошибка не возвращается. Попытка перезаписать существующий файл каталогом приведёт к ошибке. Аргументы обрабатываются в указанном порядке, выполнение прекращается при первой ошибке.
file mtime name ?time?
Возвращает строку с десятичным значением времени последней модификации файла name. Если задано time, это время модификации, которое нужно установить для файла (эквивалентно Unix touch). Время измеряется в стандартном формате POSIX как количество секунд с момента фиксированной начальной точки времени (часто 1 января 1970 года). Если файл не существует или время модификации не может быть запрошено или установлено, генерируется ошибка.
file nativename name
Возвращает имя файла, специфичное для платформы. Это полезно, если имя файла нужно передать в платформозависимую функцию, например, в exec под Windows (см. ПРИМЕРЫ ниже).
file normalize name
Возвращает уникальное нормализованное представление пути к файловому объекту (файл, директория, ссылка и т.д.), строковое значение которого может быть использовано как уникальный идентификатор. Нормализованный путь — это абсолютный путь, из которого удалены все “../” и “./”. Также он находится в «стандартном» формате для родной платформы. В Unix это означает, что составляющие пути до последнего компонента не должны содержать символических ссылок/псевдонимов (но последний компонент пути может быть символической ссылкой), а в Windows это также означает, что мы хотим длинную форму с зависимостью от регистра (что дает нам уникальный, зависящий от регистра путь). Единственное исключение, касающееся последней ссылки в пути, необходимо, потому что Tcl или пользователь могут захотеть работать с фактической символической ссылкой (например, file delete, file rename, file copy определены для работы с символическими ссылками, а не с тем, на что они указывают).
file owned name
Возвращает 1, если файл name принадлежит текущему пользователю, и 0 в противном случае.
file pathtype name
Возвращает одно из значений: absolute, relative, volumerelative. Если name ссылается на определённый файл на определённом томе, тип пути будет absolute. Если name ссылается на файл относительно текущей рабочей директории, тип пути будет relative. Если name ссылается на файл относительно текущей рабочей директории на указанном томе или на определённый файл на текущем рабочем томе, то тип пути — volumerelative.
file readable name
Возвращает 1, если файл name читаем текущим пользователем, и 0 в противном случае.
file readlink name
Возвращает значение символической ссылки, заданной name (т.е. имя файла, на который она указывает). Если name не является символической ссылкой или ее значение не может быть прочитано, возвращается ошибка. На системах, не поддерживающих символические ссылки, этот параметр не определён.
file rename ?-force? ?--? source target
file rename ?-force? ?--? source ?source ...? targetDir
В первом случае файл или директория, указанная именем пути source, переименовывается в target, перемещая файл, если target указывает имя в другой директории. Если target — существующая директория, используется второй вариант. Второй вариант перемещает каждый файл или директорию source в директорию targetDir. Существующие файлы не будут перезаписаны, если не указан параметр -force. При работе внутри одной файловой системы Tcl переименовывает символические ссылки, а не то, на что они указывают. Попытка перезаписать непустую директорию, перезаписать директорию файлом или файл директорией приведёт к ошибке. Аргументы обрабатываются в указанном порядке, прерывая выполнение на первой ошибке, если она возникнет. Маркер -- обозначает конец переключателей; аргумент, следующий за --, будет обрабатываться как source, даже если он начинается с -.
file rootname name
Возвращает все символы в name до, но не включая, последнюю точку в последнем компоненте имени. Если последний компонент name не содержит точки, то возвращает name.
file separator ?name?
Если аргумент не указан, возвращает символ, используемый для разделения сегментов пути для родных файлов на данной платформе. Если путь задан, от файловой системы, отвечающей за этот путь, запрашивается символ разделителя. Если ни одна файловая система не принимает name, генерируется ошибка.
file size name
Возвращает десятичную строку, представляющую размер файла name в байтах. Если файл не существует или его размер не может быть запрошен, генерируется ошибка.
file split name
Возвращает список, элементы которого — компоненты пути в name. Первый элемент списка будет иметь тот же тип пути, что и name. Все остальные элементы будут относительными. Разделители путей будут отброшены, если они не нужны для того, чтобы гарантировать, что элемент однозначно относительный. Например, в Unix
file split /foo/~bar/baz

возвращает «/ foo ./~bar baz», чтобы гарантировать, что последующие команды, использующие третий компонент, не пытались выполнить подстановку тильды.

file stat name varName
Вызывает системный вызов stat для name и использует переменную, заданную varName, для хранения информации, возвращённой из системного вызова. VarName обрабатывается как переменная массива, и устанавливаются следующие элементы этой переменной: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type, uid. Каждый элемент, кроме type, — это десятичная строка со значением соответствующего поля из структуры возвращаемого значения stat; см. страницу руководства для stat для получения подробной информации о значениях. Элемент type указывает тип файла в том же формате, что и возвращаемая команда file type. Эта команда возвращает пустую строку.
file system name
Возвращает список из одного или двух элементов, первый из которых — имя файловой системы для использования с файлом, а второй, если задан, — произвольная строка, представляющая специфику или тип файловой системы в расположении в пределах этой файловой системы. Если файловая система поддерживает только один тип файла, второй элемент может не быть предоставлен. Например, родные файлы имеют первый элемент «native» и второй, если задан, — имя типа системы файла, специфичное для платформы (например, «NTFS», «FAT» в Windows). Общая виртуальная файловая система может вернуть список «vfs ftp» для представления файла на удалённом ftp-сайте, смонтированном как виртуальная файловая система с помощью расширения «vfs». Если файл не принадлежит ни одной файловой системе, генерируется ошибка.
file tail name
Возвращает все символы в последнем компоненте файловой системы name. Любой конечный разделитель каталогов в name игнорируется. Если name не содержит разделителей, возвращается name. Таким образом, file tail a/b, file tail a/b/ и file tail b все возвращают b.
file tempfile ?nameVar? ?template?
Создаёт временный файл и возвращает открытый канал для чтения и записи этого файла. Если задан nameVar, он указывает на переменную, в которую будет записано имя временного файла; если он отсутствует, Tcl попытается организовать удаление временного файла, как только он больше не будет нужен. Если задан template, он указывает части шаблона имени файла, используемые при его создании (например, директорию, базовое имя или расширение), хотя некоторые платформы могут игнорировать некоторые или все эти части и использовать встроенный по умолчанию вместо этого.

Обратите внимание, что временные файлы только создаются на родной файловой системе. Поэтому на них можно положиться для использования с родными API операционной системы и внешними программами, требующими имени файла.

file type name
Возвращает строку, указывающую тип файла name, которая будет одной из следующих: file, directory, characterSpecial, blockSpecial, fifo, link или socket.
file volumes
Возвращает абсолютные пути к смонтированным на системе томам в виде корректного списка Tcl. Без каких-либо виртуальных файловых систем, смонтированных в качестве корневых томов, в UNIX, команда всегда вернёт «/», поскольку все файловые системы смонтированы локально. В Windows она вернёт список доступных локальных дисков (например, «a:/ c:/»). Если любая виртуальная файловая система смонтировала дополнительные тома, они будут в возвращаемом списке.
file writable name
Возвращает 1, если файл name доступен для записи текущим пользователем, и 0 в противном случае.

Проблемы переносимости

Unix
Эти команды всегда работают с реальными идентификаторами пользователя и группы, а не с эффективными.
Windows
Подкоманда file owned использует идентификатор пользователя (SID) маркера процесса, а не маркера потока, который может подменять другим пользователем.

Примеры

Эта процедура показывает, как искать файлы C в заданной директории, у которых есть соответствующий файл объекта в текущей директории:
proc findMatchingCFiles {dir} {
    set files {}
    switch $::tcl_platform(platform) {
        windows {
            set ext .obj
        }
        unix {
           set ext .o
        }
    }
    foreach file [glob -nocomplain -directory $dir *.c] {
        set objectFile [file tail [file rootname $file]]$ext
        if {[file exists $objectFile]} {
            lappend files $file
        }
    }
    return $files
}

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

set oldName foobar.txt
set newName foo/bar.txt
# Make sure that where we're going to move to exists...
if {![file isdirectory [file dirname $newName]]} {
    file mkdir [file dirname $newName]
}
file rename $oldName $newName
file link -symbolic $oldName $newName

В Windows файл можно легко «запустить» (что эквивалентно двойному щелчку по нему в проводнике), но имя, передаваемое операционной системе, должно быть в родном формате:

exec {*}[auto_execok start] {} [file nativename ~/example.txt]

См. также

filename, open, close, eof, gets, tell, seek, fblocked, flush

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/file.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/file.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API