Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проверка на существование файла

47K
21 февраля 2010 года
Matvet
22 / / 06.02.2010
Здравствуйте.
Подскажите, как при помощи CreateFile узнать, существует файл или нет?
Или по-другому как-нибудь?
8.4K
21 февраля 2010 года
z0rch
275 / / 02.09.2008
цитирую msdn
Цитата:
CreateFile: dwCreationDisposition [in]
OPEN_EXISTING 3
Opens a file or device, only if it exists.

If the specified file or device does not exist, the function fails and the last-error code is set to ERROR_FILE_NOT_FOUND (2).

47K
21 февраля 2010 года
Matvet
22 / / 06.02.2010
А можно пример? Желательно на delphi
7
21 февраля 2010 года
@pixo $oft
3.4K / / 20.09.2006
 
Код:
CreateFile(<имя файла>,0,0,0,Open_Existing,0,0)

Пример простейш.Будто нельзя было в MSDN поискать(хотя бы)
3
22 февраля 2010 года
Green
4.8K / / 20.01.2000
Для проверки существования лучше проверить атрибуты файла, чем выполнять более сложную и конфликтную операцию его открытия.
7
22 февраля 2010 года
@pixo $oft
3.4K / / 20.09.2006
1.Чем она сложна и конфликтна?
2.Определение атрибутов подразумевает открытие файла,так что результат вряд ли другой будет

Просьба по пунктам
3
22 февраля 2010 года
Green
4.8K / / 20.01.2000
Цитата: @pixo $oft
1.Чем она сложна и конфликтна?
2.Определение атрибутов подразумевает открытие файла,так что результат вряд ли другой будет

Просьба по пунктам


Функция CreateFile, сводящаяся в итоге к IoCreateFile, принимает больше аргументов, выполняет больше проверок, кроме того оставляет открытым хендл объекта.
Да, оба варианта сводятся к вызову ObOpenObjectByName, но все дело в деталях:

вызов ObOpenObjectByName в IoCreateFile

Код:
//
    // Attempt to open the file object by name.  This will yield the handle
    // that the user is to use as his handle to the file in all subsequent
    // calls, if it works.
    //
    // This call performs a whole lot of the work for actually getting every-
    // thing set up for the I/O system.  The object manager will take the name
    // of the file and will translate it until it reaches a device object (or
    // it fails).  If the former, then it will invoke the parse routine set up
    // by the I/O system for device objects.  This routine will actually end
    // up creating the file object, allocating an IRP, filling it in, and then
    // invoking the driver's dispatch routine with the packet.
    //

    status = ObOpenObjectByName( ObjectAttributes,
                                 (POBJECT_TYPE) NULL,
                                 requestorMode,
                                 NULL,
                                 DesiredAccess,
                                 &openPacket,
                                 &handle );


вызов ObOpenObjectByName в NtQueryAttributesFile
Код:
//
    // Open the object by its name.  Because of the special QueryOnly flag set
    // in the open packet, the parse routine will open the file, and then
    // realize that it is only performing a query.  It will therefore perform
    // the query, and immediately close the file.
    //

    status = ObOpenObjectByName( ObjectAttributes,
                                 (POBJECT_TYPE) NULL,
                                 requestorMode,
                                 NULL,
                                 FILE_READ_ATTRIBUTES,
                                 &openPacket,
                                 &handle );


P.S. топикпастеру: 11 способов определить есть ли файл на диске
7
22 февраля 2010 года
@pixo $oft
3.4K / / 20.09.2006
Спасибо за хорошо аргументированное объяснение:)

Уясню для себя.И да,я потом прочёл про GetFileAttributes,там только имя файла.Действительно,удобнее
14
25 февраля 2010 года
Phodopus
3.3K / / 19.06.2008
На самом деле и CreateFile() обладает подобной функциональностью:
[QUOTE=MSDN]dwDesiredAccess
If this parameter is 0 (zero), the application can query file and device attributes without accessing a device. This is useful for an application to determine the size of a floppy disk drive and the formats it supports without requiring a floppy in a drive. It can also be used to test for the existence of a file or directory without opening them for read or write access.
[/QUOTE]
Но проверка атрибутов и выглядит логичнее в контексте кода, и дереференс ссылки выполняет сама, и информации как-то больше выдает. (Особо отмечу что получение в качестве результата INVALID_FILE_ATTRIBUTES автоматически не означает отсутствия файла - в этом случае проверяйте код ошибки).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог