Быстрое Чтение/Запись

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Быстрое Чтение/Запись

Сообщение |kerish| » 31.10.2004 (Вс) 19:49

Существует ли DLL-ка для быстрого чтения/записи файла? Быстрее чем VB-шные.
FSO не годится.

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Сообщение KiloGraf » 31.10.2004 (Вс) 20:06

В апи-гид'е, вот такая штука...

Код: Выделить всё
Const MOVEFILE_REPLACE_EXISTING = &H1
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const FILE_BEGIN = 0
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_NEW = 1
Const OPEN_EXISTING = 3
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Private Declare Function SetVolumeLabel Lib "kernel32" Alias "SetVolumeLabelA" (ByVal lpRootPathName As String, ByVal lpVolumeName As String) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Private Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim sSave As String, hOrgFile As Long, hNewFile As Long, bBytes() As Byte
    Dim sTemp As String, nSize As Long, Ret As Long
    'Ask for a new volume label
    sSave = InputBox("Please enter a new volume label for drive C:\" + vbCrLf + " (if you don't want to change it, leave the textbox blank)")
    If sSave <> "" Then
        SetVolumeLabel "C:\", sSave
    End If

    'Create a buffer
    sTemp = String(260, 0)
    'Get a temporary filename
    GetTempFileName "C:\", "KPD", 0, sTemp
    'Remove all the unnecessary chr$(0)'s
    sTemp = Left$(sTemp, InStr(1, sTemp, Chr$(0)) - 1)
    'Set the file attributes
    SetFileAttributes sTemp, FILE_ATTRIBUTE_TEMPORARY
    'Open the files
    hNewFile = CreateFile(sTemp, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
    hOrgFile = CreateFile("c:\config.sys", GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)

    'Get the file size
    nSize = GetFileSize(hOrgFile, 0)
    'Set the file pointer
    SetFilePointer hOrgFile, Int(nSize / 2), 0, FILE_BEGIN
    'Create an array of bytes
    ReDim bBytes(1 To nSize - Int(nSize / 2)) As Byte
    'Read from the file
    ReadFile hOrgFile, bBytes(1), UBound(bBytes), Ret, ByVal 0&
    'Check for errors
    If Ret <> UBound(bBytes) Then MsgBox "Error reading file ..."

    'Write to the file
    WriteFile hNewFile, bBytes(1), UBound(bBytes), Ret, ByVal 0&
    'Check for errors
    If Ret <> UBound(bBytes) Then MsgBox "Error writing file ..."

    'Close the files
    CloseHandle hOrgFile
    CloseHandle hNewFile

    'Move the file
    MoveFileEx sTemp, "C:\KPDTEST.TST", MOVEFILE_REPLACE_EXISTING
    'Delete the file
    DeleteFile "C:\KPDTEST.TST"
    Unload Me
End Sub


.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.10.2004 (Вс) 20:38

А как сейчас читаешь файл? В цикле Get/Put?

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Сообщение KiloGraf » 31.10.2004 (Вс) 21:20

Вот, вот...

Amed писал(а):А как сейчас читаешь файл? В цикле Get/Put?


Если с фалом работать напрямую (Get/Put), и без всяких циклов, то мне кажется, АПИшки не понадобятся...
Но к великому сожалению, не всегда такой способ пременим.

.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Re: Быстрое Чтение/Запись

Сообщение Ennor » 31.10.2004 (Вс) 21:25

|kerish| писал(а):Существует ли DLL-ка для быстрого чтения/записи файла? Быстрее чем VB-шные.
FSO не годится.

А ты, случаем, в ограничение своего железа не уперся? У меня, например, все летает...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.10.2004 (Вс) 21:26

Да нет, я немного не про это

Нужно не в цикле делать Get/Put, а читать сразу в Byte массив, тогда очень быстро получается...

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Сообщение KiloGraf » 31.10.2004 (Вс) 21:37

Amed
Ну естественно, если файл один, и можно за один заход его в массив закинуть...
А, если файлов - тысячи, то их собрать в массив, уже время понадобиться.

.
Nonsense in BASIC. © 1982 ...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.10.2004 (Вс) 21:40

Ну, думаю, мы про один файл говорим сейчас.

А множество файлов, естественно, собирать дольше :)

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 31.10.2004 (Вс) 21:56

На практике будет один файл размером 10-15 Мб.
Структура очень похожая на INI.
Нужно быстро его обрабатывать.
Писать, считывать.
Быстро в смысле не моментально, но и не час :)
Вопрос номер два:
Как по-быстрее найти нужную строчку в этом файле.
Например мне нужна строка "[BlaBlaBla]".
Прокручивать по циклу весь файл - строчка за строчкой и сравнивать строчку с нужным вариантом?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.10.2004 (Вс) 22:07

Ыменно так.
Только файл сначала полностью в оперативку :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Сообщение KiloGraf » 31.10.2004 (Вс) 22:10

Два способа считать файл...

Код: Выделить всё
'Вариант 1
  Dim strText As String
  Dim ff As Integer
  ff = FreeFile
  Open "File.ext" For Binary As #ff
    strText = Space(LOF(ff))
    Get #ff, , strText
  Close #ff
 
  'Вариант 2
  Dim bytData() As Byte
  Dim ff As Integer
  ff = FreeFile
  Open "File.ext" For Binary As #ff
    ReDim bytData(LOF(ff) - 1)
    Get #ff, , bytData
  Close #ff


...и потом работать с массивом, в нем быстро можно найти искомое [BlaBlaBla] и вычислить его нахождение в файле (позицию относительно нуля).

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 31.10.2004 (Вс) 22:12

А писАть как?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.10.2004 (Вс) 22:12

Да, согласен. Идея понятна?

Сначала делаем BigArray() As Byte

Потом Redim BigArray(GetFileLength) 'см. API-Guide
Потом Open filename for binary as #1
Get #1, , BigArray

Потом уже поиск по BigArray...

Не уверен в точном синтаксисе, - пишу на память :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 31.10.2004 (Вс) 22:14

Писать так же почти - Put #1, ,BigArray...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.10.2004 (Вс) 22:15

Не, лучше Вариант 3...
Код: Выделить всё
strtext=input$(lof(1), #1)


Писать -
Код: Выделить всё
? #1,strtext;
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 31.10.2004 (Вс) 22:16

Всем спасибо.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.11.2004 (Чт) 7:57

Кстати, я бы так делать не рекомендовал:

Код: Выделить всё
Open "File.ext" For Binary As #ff
strText = Space(LOF(ff))
Get #ff, , strText
Close #ff


А именно - не стоит делать буфер размером в десятки мегабайт (то бишь по размеру файла). Читайте кусочками, килобайт по 16..32 и будет вам счастье, а иначе огребете дикие тормоза...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 04.11.2004 (Чт) 10:06

Да, согласен. Это наибыстрейший вариант ))

GSerg, как всегда, наиумнейший из людей :wink:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: The trick и гости: 3

    TopList  
cron