Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Как определить - открыт ли файл? Добавлено: 25.03.08 12:13  

Автор вопроса:  LonerWanderer
Ну собственно сабж. Создаю файл спецификации и перезаписываю существующий файл. Но файл может быть открыт по сети на другой машине. Как проверить состояние файла?
Здесь в примерах нашел код по определению атрибутов файла через GetFileAttributes из библиотеки "kernel32.dll". Но там только атрибуты файловой системы. Атрибут "для чтения" при открытии файла не устанавливается.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #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 c аттрибутом OF_SHARE_EXCLUSIVE. Если файл открыт другим процессом для чтения или записи то функция вернет значение HFILE_ERROR.

Функция OpenFile и ее параметры:
Declare Function OpenFile Lib "kernel32" Alias "OpenFile" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
· 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 OFS_MAXPATHNAME = 128
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-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 25.03.08 20:41
OpenFile это зло.

Ответить

Номер ответа: 5
Автор ответа:
 LonerWanderer



Вопросов: 18
Ответов: 66
 Профиль | | #5 Добавлено: 25.03.08 22:56
OpenFile это зло.

А что есть добро?

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 26.03.08 00:46
CreateFile есть добро =)

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 26.03.08 06:50
Executioner глаголет истину. Либо CreateFileEx

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 26.03.08 06:51
Если бы он существовал :)

Ответить

Номер ответа: 9
Автор ответа:
 LonerWanderer



Вопросов: 18
Ответов: 66
 Профиль | | #9 Добавлено: 26.03.08 10:59
Вот вы говорите - юзай CreateFile. Спасибо за подсказку, но я апи пока плохо понимаю.
Можно попросить код для определения "занятости" файла?
А пока не стал заморачиваться. Поставил обработчик на 1004 ошибку.
Но если будет код с API, то с удовольствием рассмотрю и этот вариант ;)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам