Что нового

Как лучше определить существование файла?

winkot

Новичок
Сообщения
169
Репутация
0
Надо определить - существует ли файл. Также имеется массив, в котором прописаны файлы в исследуемой папке. Как лучше сделать - с помощью _ArraySearch или FileExists?
Какой способ менее затратный для системы?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Первая функция это поиск значения в массиве. К файлам она не имеет отношения. Вторая, это проверка существования файла
 

All2khoff

Продвинутый
Сообщения
352
Репутация
65
Предполагаю что ТС имел ввиду использование функции
Код:
_FileListToArray
а уже в последствии сравнивать два массива имеющийся и полученный с помощью первой функции.
 
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
Поясню задачу еще раз. Надо определить - имеется ли в определенной папке файл. Это можно сделать с помощью
Код:
FileExists
. Но кроме того имеется уже готовый массив (созданный с помощью
Код:
_FileListToArray
в нем эти файлы уже прописаны. Так вот - какой способ определеня файла для системы будет менее затратный - использовать
Код:
FileExists
или
Код:
_ArraySearch
?
Я думаю, что лучше использовать
Код:
_ArraySearch
так как
Код:
FileExists
будет каждый раз обращаться к винчестеру. А это лишнее время и нагрузка на него. Но хотелось бы узнать мнение профессионалов.
 

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Поясню задачу еще раз. Надо определить - имеется ли в определенной папке файл. Это можно сделать с помощью
Код:
FileExists
. Но кроме того имеется уже готовый массив (созданный с помощью
Код:
_FileListToArray
в нем эти файлы уже прописаны.
В общем случае, никто не может гарантировать, что список имён в массиве актуальный — ведь сторонний процесс запросто может что-то удалить из папки или добавить в неё или переименовать. Т.о.
Код:
FileExists()
в принципе надёжнее, пусть даже слегка медленнее. А то, что
будет каждый раз обращаться к винчестеру
в целом по барабану — кэш в системе именно для того и существует, чтобы на каждый чих не дрочить винчестер…
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Смотря что вы проверяете в массиве...
Если все файлы, то в цикле нет смысла использовать ещё один цикл с _ArraySearch, тогда FileExists
---
Если вы проверяете один путь, то я бы не использовал массив , а загнал бы все пути в нижнем регистре в MAP библиотеку, можно Scripting.Dictionary, можно в System.Collections.Hashtable
Создание займёт менее секунды, даже если путей около 100.000
Проверка пути в библиотеке занимает миллисекунды MapExists, заодно, если есть путь в библиотеке можно проверить и FileExists, так же его можно удалить или добавить другой
Так же можно сделать доп. проверки если идут и папки и файлы в библиотеке

Код:
; проверка 1-папка, 2-файл, 0-не существует
Func _Fold1File2No0($sFile)
  Return FileExists($sFile)?(StringInStr(FileGetAttrib($sFile),'D')?1:2):0
EndFunc
; проверка , 1-файл, 0-не существует 0-папка
Func _File1Fold0No0($sFile)
  Return FileExists($sFile)?(StringInStr(FileGetAttrib($sFile),'D')?0:1):0
EndFunc
 
Последнее редактирование:

RaZum

Знающий
Сообщения
78
Репутация
14
Пробывал обрабатывать большие массивы, и map оказался в разы быстрее чем Scripting.Dictionary.
Возможно это только у меня. Хотя для обработки малого количества, это видимо мелочь.
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Верх