Проверка на существование файла
Подскажите, как при помощи CreateFile узнать, существует файл или нет?
Или по-другому как-нибудь?
Цитата:
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).
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).
А можно пример? Желательно на delphi
Код:
CreateFile(<имя файла>,0,0,0,Open_Existing,0,0)
Пример простейш.Будто нельзя было в MSDN поискать(хотя бы)
Для проверки существования лучше проверить атрибуты файла, чем выполнять более сложную и конфликтную операцию его открытия.
2.Определение атрибутов подразумевает открытие файла,так что результат вряд ли другой будет
Просьба по пунктам
Цитата: @pixo $oft
1.Чем она сложна и конфликтна?
2.Определение атрибутов подразумевает открытие файла,так что результат вряд ли другой будет
Просьба по пунктам
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 );
// 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 );
// 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 способов определить есть ли файл на диске
Уясню для себя.И да,я потом прочёл про GetFileAttributes,там только имя файла.Действительно,удобнее
[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 автоматически не означает отсутствия файла - в этом случае проверяйте код ошибки).