Моя программа пишет строчки в текстовый файл и должна уметь стирать только последнюю строчку в этом файле.
октрываю файл
Open path For Append As #1
Print #1, temp
Close #1
Т.к. файл м.б. большим хорошо бы не читать его весь целиком для того чтобы стереть последнюю строчку.
Как стереть только последнюю строчку в этом файле?
Переменная temp каждый раз новой случайной длинны.
Как стереть последнюю строчку?
Алгоритм такой:
-Определяем количество строк в файле
-Записываем в массив количество строк-1
-Вставляем этот массив в файл Print -ом
Если ты так стремишься к оптимизации, то не стирай стоку, а помечай её. Типа она останется в файле, но в её начале будет какая - нибудь комбинация байтов, которая будет означать, что эта строка удалена (например: chr(1)+chr(2)+chr(3) )), а при следующей записи ты просто затрешь эту строку новой.
Конечно, всё не так просто как кажется, нужно ещё придумать, что делать в том случае если старая строка оказалась длинее новой, но это уже как говорится, дело техники.
Кста, писать и читать ессно нужно в бинарном режиме (принт не катит )
Можно еще особенно извратиться и найти первое вхождение символа конца строки Chr(13) с конца файла. Но файл придеться переписывать как ни крути. Без переписывания есть вариант затереть любым символом эту строку (напр. пробелом), который будет плюсоваться к предыдущей строке.
найти первое вхождение символа конца строки Chr(13) с конца файла
Уже теплее. Переписывать не нужно.
Почитай по функциям:
CreateFile /OPEN_EXISTING/
SetFilePointer
WriteFile
CloseHandle
Лень писать пример, но все просто.
та смысл с апи заморачиваться? Ключевое дело здесь - SetFilePointer, но басика помойму было что-то вроде Seek #1, pos или на крайний случай открыть в бинарном режиме и Get/Put..
If (OriginalSize > 128) And (SetFilePointer(Handle, -128, ByVal 0, FILE_END) = OriginalSize - 128) Then 'A little protection from another file having messed with it during this function
Call SetFilePointer(Handle, -128, ByVal 0, FILE_END)
If SetEndOfFile(Handle) <> 0 Then RemTagsV1 = True
Else
RemTagsV1 = False
End If
Call CloseHandle(Handle)
End If
End Function
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, 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 Boolean
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const GENERIC_WRITE = &H40000000
Private Const CREATE_NEW = 1
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_BEGIN = 0
Private Const FILE_END = 2
Public Function ResizeFile(FileName As String, EOFPosition As Long, Optional Relative As Boolean = False, Optional CreateNew As Boolean = False) As Boolean
Dim hFile As Long, CNF As Long, FEOF As Long
If CreateNew Then CNF = CREATE_NEW Else CNF = OPEN_EXISTING
If Relative Then FEOF = FILE_END Else FEOF = FILE_BEGIN
hFile = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CNF, 0, 0)
If hFile = 0 Then Exit Function
SetFilePointer hFile, EOFPosition, 0, FEOF
ResizeFile = SetEndOfFile(hFile)
CloseHandle hFile
End Function