Страница: 1 |
Страница: 1 |
Вопрос: Как определить - открыт ли файл?
Добавлено: 25.03.08 12:13
Автор вопроса: LonerWanderer
Ну собственно сабж. Создаю файл спецификации и перезаписываю существующий файл. Но файл может быть открыт по сети на другой машине. Как проверить состояние файла?
Здесь в примерах нашел код по определению атрибутов файла через GetFileAttributes из библиотеки "kernel32.dll". Но там только атрибуты файловой системы. Атрибут "для чтения" при открытии файла не устанавливается.
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #1
Добавлено: 25.03.08 12:17
Так ошибка вылезет при перезаписи, если он открыт уже...
Номер ответа: 2
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #2
Добавлено: 25.03.08 12:27
Вылезает. Можно, конечно, написать обработчик при ошибке перезаписи. Но тогда другой вопрос: эксель при открытии файла показывает, что файл открыт пользователем таким-то.
Предположим, что я сначала буду фоном открывать файл и если все нормально, то закрывать его и перезаписывать. Как взять информацию, что файл уже открыт другим пользователем, чтобы вывести msgbox?
Номер ответа: 3
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #3
Добавлено: 25.03.08 14:17
Вот нашел на другом форуме подсказку:
Функция OpenFile и ее параметры:
· lpFileName
Points to a null-terminated string that names the file to be opened. The string must consist of characters from the Windows 3.x character set. The OpenFile function does not support Unicode filenames.
· lpReOpenBuff
Points to the OFSTRUCT structure that receives information about the file when it is first opened. The structure can be used in subsequent calls to the OpenFile function to refer to the open file.
The OFSTRUCT structure contains a pathname string member whose length is limited to OFS_MAXPATHNAME characters. OFS_MAXPATHNAME is currently defined to be 128. Because of this, you cannot use the OpenFile function to open a file whose path length exceeds 128 characters. The CreateFile function does not have such a path length limitation.
...
OF_SHARE_EXCLUSIVE
Opens the file with exclusive mode, denying both read and write access to other processes. If the file has been opened in any other mode for read or write access, even by the current process, the function fails.
Пример использования:
Const OF_CREATE = &H1000
Const OF_READ = &H0
Const OF_WRITE = &H1
Private Type OFSTRUCT
cBytes As Byte
fFixedDisk As Byte
nErrCode As Integer
Reserved1 As Integer
Reserved2 As Integer
szPathName(OFS_MAXPATHNAME) As Byte
End Type
Private Declare Function CopyLZFile Lib "lz32" (ByVal n1 As Long, ByVal n2 As Long) As Long
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub Form_Load()
'KPD-Team 1998
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim sFile As String, hDecomp As Long, hResult As Long
Dim OF As OFSTRUCT, sSaveTo As String
'Ask for a file to decompress
sFile = InputBox("Please, enter a file to decompress."
'Ask for a file to decompress it to
sSaveTo = InputBox("Please, enter a filename to decompress it to."
'Open the two files
hDecomp = OpenFile(sFile, OF, OF_READ)
hResult = OpenFile(sSaveTo, OF, OF_WRITE Or OF_CREATE)
'decompress the file
CopyLZFile hDecomp, hResult
'Close the two files
CloseHandle hDecomp
CloseHandle hResult
Unload Me
End Sub
Но вот как использовать параметр OF_SHARE_EXCLUSIVE я что-то я что-то не пойму. Может подскажете?
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 25.03.08 20:41
OpenFile это зло.
Номер ответа: 5
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #5
Добавлено: 25.03.08 22:56
А что есть добро?
Номер ответа: 6
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #6
Добавлено: 26.03.08 00:46
CreateFile есть добро
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 26.03.08 06:50
Executioner глаголет истину. Либо CreateFileEx
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 26.03.08 06:51
Если бы он существовал
Номер ответа: 9
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #9
Добавлено: 26.03.08 10:59
Вот вы говорите - юзай CreateFile. Спасибо за подсказку, но я апи пока плохо понимаю.
Можно попросить код для определения "занятости" файла?
А пока не стал заморачиваться. Поставил обработчик на 1004 ошибку.
Но если будет код с API, то с удовольствием рассмотрю и этот вариант