Различные функции для работы с файлами

getSourceFileName()
Функция возвращает полное имя (путь+имя+расширение) файла скрипта, из которого была вызвана.
Если вызов произошел не из допустимого файла скрипта, например, такое происходит в случае, когда функцию запускают из MAXScript Listener, возвращается значение undefined.
Если вызов произошел из несохраненного скрипта (Untitled), возвращается пустая строка, либо путь без имени файла.
Если вызов произошел из строки, выполняемой функцией execute(), результатом будет являться файл этого же скрипта, в котором находится execute(). Функция доступна во всех версиях 3ds max, начиная с 9.

Чтобы показать действие следующих функций на примерах, в качестве полного имени файла - аргумента <filename_string> будем брать строку "g:\\subdir1\\subdir2\\myImage.jpg"

filenameFromPath <filename_string>
Возвращает имя и расширение файла, определяя их по полному имени файла. Функция полезна при создании надписей на кнопках, соответствующих файлам в интерфейсе свитка. Для нашего примера результат будет "myImage.jpg"

getFilenamePath <filename_string>
Возвращает путь к файлу - часть полного имени, т.е. только последовательность каталогов без имени и расширения файла. Результат для нашего примера "g:\subdir1\subdir2\"

getFilenameFile <filename_string>
Возвращает имя файла, выделяя его из полного имени. Результат для нашего примера "myImage"

getFilenameType <filename_string>
Возвращает тип файла, т.е. его расширение. Результат для нашего примера ".jpg"

doesFileExist <filename_string>
Возвращает true, если файл существует и false, если нет.

getFiles <wild_card_filename_string>
Возвращает массив имен файлов, которые соответствуют заданному критерию. В следующем примере все *.max файлы из каталога c:\foo заносятся в массив, который потом перебирается в цикле, файлы последовательно открываются и объекты, находящиеся в каждом файле, печатаются в MAXScript Listener:

files = getFiles "c:\\foo\\*.max"
for f in files do (loadMAXFile f; print objects)

Также функция getFiles() может использоваться для определения существования файла. Например, следующая функция возвращает true, если существует файл(ы), удовлетворяющий заданому имени или критерию: fn existFile fname = (getfiles fname).count != 0

getDirectories <wild_card_directory_name_string>
Возвращает массив каталогов, которые соответствуют заданному критерию. Пример:

fn getFilesRecursive root pattern =
(
dir_array = GetDirectories (root+"/*")
for d in dir_array do
join dir_array (GetDirectories (d+"/*"))
my_files = #()
for f in dir_array do
join my_files (getFiles (f + pattern))
my_files
)
--ПОЛУЧИТЬ ВСЕ ФАЙЛЫ .ms ИЗ КАТАЛОГА c:/temp
--И ВСЕХ ЕГО ПОДКАТАЛОГОВ:
getFilesRecursive "c:/temp" "*.ms"

makeDir <directory_path_string> all:<boolean>
Создает новый каталог по указанному адресу. Возвращает true, если операция по созданию каталога завершается успешно и false, если нет (такое бывает, если каталог в указанном месте создать невозможно, либо он там уже существует). В случае, когда дополнительный параметр all: равен true (это значение по умолчанию, начиная с 9-ой версии, в 8-ке по умолчанию было значение false) все уровни подкаталогов, указанные в пути, будут созданы, если они еще не существуют.

deleteFile <filename_string>
Удаляет указанный файл. Если файл открыт в MAXScript, то операция невозможна. Возвращается значение true при успешном удалении и false, если удаление не удалось.

renameFile <old_filename_string> <new_filename_string>
Переименовывает указанный файл, задавая ему новое имя. Функцию также можно использовать для перемещения файла между каталогами. Операция невозможна, если файл с новым именем уже существует, либо старый файл открыт в MAXScript. Возвращается значение true при успешном переименовании и false, если переименование не удалось.

copyFile <existing_filename_string> <new_filename_string>
Копирует существующий файл в новый. Операция невозможна, если новый файл уже существует или не может быть создан, либо существующий файл открыт в MAXScript. Возвращается значение true при успешном копировании и false, если копирование не удалось.

getFileSize <filename_string>
Возвращает размер указанного файла в байтах. Если файл найти не удалось, возвращает 0

getFileAttribute <filename_string> <attribute>
setFileAttribute <filename_string> <attribute> <boolean>
Функции получают и задают атрибуты файла. Функция получения возвращает true или false в зависимости от состояния указанного атрибута, функция задания устанавливает конкретный атрибут в указанное состояние (оставляя без изменений остальные атрибуты). Допустимые значения параметра <attribute> следующие:
#readOnly
#hidden
#system
#directory
#archive
#temporary
#normal

getFileModDate <filename_string>
Возвращает значение String, содержащее дату изменения указанного файла, например: "1/29/99 1:52:05 PM"

getFileCreateDate <filename_string>
Возвращает значение String, содержащее дату создания указанного файла.

getFileVersion <filename_string>
Возвращает версию файла и версию продукта указанного файла, или значение unknown, если данная информация для файла не указана. Эти данные как правило указываются только для исполняемых файлов (*.exe) или расширений приложений (*.dll).
Пример: GetFileVersion (getDir #maxRoot + "\\3dsmax.exe")

getMAXIniFile()
Начиная с 6-ой версии 3ds max возвращает текущий файл 3dsmax.ini как строку полного имени. Для некоторых продуктов (подозреваю что это VIZ и т.п.), которые хранят установки ini в реестре, данная фукнция вернет значение undefined

Примеры использования вышеперечисленных функций:
for f in getFiles "3dsmax\\maps\\*.jpg" do deleteFile f

for d in getDirectories "D:\\foo\\*" do
for f in getFiles (d + "*.*") do
copyFile f ("C:\\temp\\" + getFilenameFile f + getFilenameType f)

if (getFiles "foo.max").count == 0 then print "File missing"


getOpenFileName [ caption:<title> ] \
[ filename:<seed_filename_string> ] \
[ types:<description1>|<pattern1>|<description2>|<pattern2>|...| ] \
[ historyCategory:<string> ]

getSaveFileName [ caption:<title>] \
[ filename:<seed_filename_string> ] \
[ types:<description1>|<pattern1>|<description2>|<pattern2>|...| ] \
[ historyCategory:<string> ]

Обе функции возвращают полностью заданное пользователем имя файла или значение undefined, если пользователь отменил операцию.
Когда задан дополнительный аргумент filename:, то для определения пути и имени файла, который будет загружен или сохранен, используется строковое значение. Диалог автоматически перемещается в указанный каталог (если он доступен на диске или в сети), отображает в области просмотра его содержимое и подсказывает имя файла в поле "File name". Если указанный путь не существует, используется существующий путь и отображается только имя файла, как и требовалось. Например:
f = getOpenFileName caption:"Open A Test File:" \
filename:"c:/test/test.txt"

Аргумент types: позволяет вам задать определенные типы файлов и их описаний для выпадающего списка типов файлов в диалоговых окнах загрузки и записи. Нужно задавать строку для этого аргумента в специальном формате:
"<description1>|<pattern1>|<description2>|<pattern2>|...|"
Другими словами, каждый элемент последовательности из описаний типа файла и шаблонов расширения отделяется одним символом '|' и заканчивается другим '|'. В следующем примере задается три типа файлов в выпадающем списке, первый читается как "Data(*.dat)" и соответствует файлам *.dat, второй читается "Excel(*.csv)" и соответствует *.csv и третий читается "All" и соответствует любому файлу:
f = getOpenFileName \
types:"Data(*.dat)|*.dat|Excel(*.csv)|*.csv|All|*.*|"

Функция getSaveFileName() определяет наличие файла с выбранным типом расширения.

Новая возможность 3ds max 2008: выпадающий список истории выбора файлов (history) в диалогах загрузки и записи хранит набор ранее выбранных файлов в соответствии с указанным именем истории.
Если аргумент historyCategory: не задан, используется текст заголовка, если он определен, а если нет, то вместо него используется категория по умолчанию "MAXScriptFileOpenSave". Пример:
filename = getOpenFileName \
caption:"Render To Texture Object Presets Open" \
filename:(getDir #renderPresets + @"\") \
types:"Object Preset(*.rtp)|*.rtp" \
historyCategory:"RTTObjectPresets"

При использовании одинакового имени historyCategory: в паре диалоговых окон загрузки и записи, пользователь увидит согласованные выпадающие списки истории в диалогах.

getSavePath [caption:<window_caption_string>] [initialDir:<pathname>]
Функция отображает просмотрщик каталогов, чтобы пользователь смог выбрать нужный каталог. Возвращает строку имени для выбранного каталога или значение undefined, если пользователь нажимает в просмотрщике кнопку Cancel.
Если задан аргумент initialDir: указанный каталог будет открыт в диалоге просмотра каталогов.
Пути со специальными символами поддерживаются как величины типа PathName. Функция доступна во всех версиях 3ds max, начиная с 8-ки. Пример:
getSavePath caption:"my title" initialDir:"$scripts"
getSavePath caption:"my title" initialDir:(getDir #maxroot)


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