Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Saliery
2 / 2 / 0
Регистрация: 27.01.2013
Сообщений: 253
1

Не работает дозапись WriteFile

12.01.2016, 20:39. Просмотров 874. Ответов 8
Метки нет (Все метки)

Доброго времени суток! Товарищи, проблема вот в чём, необходимо, чтобы каждый раз при вызове функции она добавляла в файл информацию в следующую строку, либо в произвольную. Попытался в SetFilePointer указать со 2-й строки писать, а она всё равно в 1-ю пишет и ничего не дописывает. Каждый раз в 1-ю строку. Помогите, пожалуйста.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
 
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const OPEN_EXISTING = 3
Private Const FILE_BEGIN = 0
Private Const INVALID_HANDLE_VALUE = -1
Private Const CREATE_ALWAYS = 2
Private Const OPEN_ALWAYS = 4
 
Private Type OVERLAPPED
  Internal As Long
  InternalHigh As Long
  offset As Long
  OffsetHigh As Long
  hEvent As Long
End Type
 
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile 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 SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
 
Private Sub Command1_Click()
 
 
  Dim szPath As String
  Dim dwWrittenBytes As Long
  Dim OV As OVERLAPPED
  Dim hFile As Long
  Dim a() As Byte
 
  a = StrConv("privet", vbFromUnicode)
  szPath = "c:\myfile.txt"
  hFile = CreateFile(szPath, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
 
  If hFile <> INVALID_HANDLE_VALUE Then
    Call SetFilePointer(hFile, 2, 0, FILE_BEGIN)
    Call WriteFile(hFile, a(0), UBound(a) + 1, dwWrittenBytes, OV)
    Call SetEndOfFile(hFile)
    Call CloseHandle(hFile)
  End If
 
 
 
 
 
End Sub
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2016, 20:39
Ответы с готовыми решениями:

структура OVERLAPPED в функции WriteFile (kernel32)
Есть API функция WriteFile (kernel32) В ней используется структура OVERLAPPED...

Дозапись в TextBox с первого символа
Надеюсь на вашу помощь. Допустим при вводе с клавиатуры в TextBox символа &quot;+&quot;...

Осуществить дозапись в текстовый файл
При сохранении данных из textbox в файл.txt, текст в файле заменяется...

Осуществить дозапись в TextBox с новой строки
Суть в том, что нужно отправить текст с кнопки Form1.Text1.Text = &quot;@echo off...

Проверка поля text на пустоту и дозапись в него
подскажите как осуществить дозапись в поле text есть форма куда вводится...

8
Казанский
14253 / 5913 / 1566
Регистрация: 24.09.2011
Сообщений: 9,310
12.01.2016, 21:10 2
Saliery, а почему API, а не операторы бейсика Open...Put...Close? Предполагается работа с очень большими файлами?
0
Saliery
2 / 2 / 0
Регистрация: 27.01.2013
Сообщений: 253
12.01.2016, 21:13  [ТС] 3
да, видеофайлы!
0
locm
2157 / 884 / 114
Регистрация: 28.10.2011
Сообщений: 2,809
Записей в блоге: 6
12.01.2016, 21:15 4
Цитата Сообщение от Saliery Посмотреть сообщение
Call SetFilePointer(hFile, 2, 0, FILE_BEGIN)
Функция позиционирует файловый указатель не на вторую строку, а на третий байт файла (отсчет начинается с нуля).
0
The trick
Модератор
7369 / 2586 / 756
Регистрация: 22.02.2013
Сообщений: 3,800
Записей в блоге: 76
12.01.2016, 21:16 5
Цитата Сообщение от Saliery Посмотреть сообщение
в следующую строку, либо в произвольную.
В произвольную не получится. Для дозаписи в конец нужно вместо
Visual Basic
1
Call SetFilePointer(hFile, 2, 0, FILE_BEGIN)
писать
Visual Basic
1
Call SetFilePointer(hFile, 0, 0, FILE_END)
1
Saliery
2 / 2 / 0
Регистрация: 27.01.2013
Сообщений: 253
12.01.2016, 21:25  [ТС] 6
Сделал! Ничего не изменилось!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Option Explicit
 
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const OPEN_EXISTING = 3
Private Const FILE_BEGIN = 0
Private Const INVALID_HANDLE_VALUE = -1
Private Const CREATE_ALWAYS = 2
Private Const OPEN_ALWAYS = 4
Private Const FILE_END = 2
 
 
Private Type OVERLAPPED
  Internal As Long
  InternalHigh As Long
  offset As Long
  OffsetHigh As Long
  hEvent As Long
End Type
 
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile 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 SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
 
Private Sub Command1_Click()
 
 
  Dim szPath As String
  Dim dwWrittenBytes As Long
  Dim OV As OVERLAPPED
  Dim hFile As Long
  Dim a() As Byte
 
  a = StrConv("privet", vbFromUnicode)
  szPath = "c:\myfile.txt"
  hFile = CreateFile(szPath, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
 
  If hFile <> INVALID_HANDLE_VALUE Then
    Call SetFilePointer(hFile, 0, 0, FILE_END)
    Call WriteFile(hFile, a(0), UBound(a) + 1, dwWrittenBytes, OV)
    Call SetEndOfFile(hFile)
    Call CloseHandle(hFile)
  End If
 
End Sub
0
The trick
Модератор
7369 / 2586 / 756
Регистрация: 22.02.2013
Сообщений: 3,800
Записей в блоге: 76
12.01.2016, 21:33 7
Лучший ответ Сообщение было отмечено Saliery как решение

Решение

Visual Basic
1
2
3
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
.....
Call WriteFile(hFile, a(0), UBound(a) + 1, dwWrittenBytes, ByVal 0&)
Добавлено через 2 минуты
или так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Const FILE_APPEND_DATA As Long = (&H4)
...
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
...
  hFile = CreateFile(szPath, FILE_APPEND_DATA, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
 
  If hFile <> INVALID_HANDLE_VALUE Then
    Call WriteFile(hFile, a(0), UBound(a) + 1, dwWrittenBytes, ByVal 0&)
    Call SetEndOfFile(hFile)
    Call CloseHandle(hFile)
  End If
2
Saliery
2 / 2 / 0
Регистрация: 27.01.2013
Сообщений: 253
12.01.2016, 22:15  [ТС] 8
а почему произвольно не получится? это же базовая ф-я!
0
The trick
Модератор
7369 / 2586 / 756
Регистрация: 22.02.2013
Сообщений: 3,800
Записей в блоге: 76
12.01.2016, 22:18 9
Цитата Сообщение от Saliery Посмотреть сообщение
а почему произвольно не получится? это же базовая ф-я!
Потому что файл представляет из себя монолитный блок байтов. Если ты хочешь вставить строку в какое-либо место, то для этого нужно раздвигать/сжимать блок (а если он 4 гб?). Конечно ты можешь писать если строки будут иметь фиксированный размер, так к примеру работают файлы произвольного доступа на VB6.
1
12.01.2016, 22:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2016, 22:18

Как сделать дозапись в Excel файл при новом запуске теста
есть тест, где заполняется ФИО и группа, в итоге эти данные заносятся в файл...

WriteFile дозапись данных в фаил
Добрый день, ребят есть такая функция, как сделать дозапись данных в конец ...

WriteFile
Есть 3 массива! а1, а2, а3! Как с помощью WriteFile, записать в фаил поочередно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru