Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Стереть только последнюю строчку в текстовом файле Добавлено: 09.07.07 16:01  

Автор вопроса:  Tur | ICQ: 201446364 
Моя программа пишет строчки в текстовый файл и должна уметь стирать только последнюю строчку в этом файле.

октрываю файл
Open path For Append As #1
Print #1, temp
Close #1

Т.к. файл м.б. большим хорошо бы не читать его весь целиком для того чтобы стереть последнюю строчку.
Как стереть только последнюю строчку в этом файле?

Переменная temp каждый раз новой случайной длинны.

Ответить

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

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



Вопросов: 38
Ответов: 121
 Профиль | | #1 Добавлено: 09.07.07 18:12
Append служит для добавления строк в конец файла.

Как стереть последнюю строчку?
Алгоритм такой:
-Определяем количество строк в файле
-Записываем в массив количество строк-1
-Вставляем этот массив в файл Print -ом

Это прекрасно делается с помощью модели FSO.

Ответить

Номер ответа: 2
Автор ответа:
 Tur



ICQ: 201446364 

Вопросов: 22
Ответов: 72
 Профиль | | #2 Добавлено: 09.07.07 19:10
Gogic, т.е. если файл 500 мгб, то для того чтобы удалить несколько байт (последнюю строчку) все равно придется читать его целиком?

Т.е. положение безвыходное?

Ответить

Номер ответа: 3
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #3
Добавлено: 09.07.07 21:31
Если ты так стремишься к оптимизации, то не стирай стоку, а помечай её. Типа она останется в файле, но в её начале будет какая - нибудь комбинация байтов, которая будет означать, что эта строка удалена (например: chr(1)+chr(2)+chr(3) :))), а при следующей записи ты просто затрешь эту строку новой.
Конечно, всё не так просто как кажется, нужно ещё придумать, что делать в том случае если старая строка оказалась длинее новой, но это уже как говорится, дело техники.
Кста, писать и читать ессно нужно в бинарном режиме (принт не катит :))

Ответить

Номер ответа: 4
Автор ответа:
 Gogic



Вопросов: 38
Ответов: 121
 Профиль | | #4 Добавлено: 09.07.07 21:43
Можно еще особенно извратиться и найти первое вхождение символа конца строки Chr(13) с конца файла. Но файл придеться переписывать как ни крути. Без переписывания есть вариант затереть любым символом эту строку (напр. пробелом), который будет плюсоваться к предыдущей строке.

Ответить

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



Вопросов: 0
Ответов: 454
 Профиль | | #5 Добавлено: 09.07.07 22:08
найти первое вхождение символа конца строки Chr(13) с конца файла

Уже теплее. Переписывать не нужно.
Почитай по функциям:
CreateFile /OPEN_EXISTING/
SetFilePointer
WriteFile
CloseHandle
Лень писать пример, но все просто.

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 10.07.07 06:33
та смысл с апи заморачиваться? Ключевое дело здесь - SetFilePointer, но басика помойму было что-то вроде Seek #1, pos или на крайний случай открыть в бинарном режиме и Get/Put..

Ответить

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



Вопросов: 0
Ответов: 454
 Профиль | | #7 Добавлено: 10.07.07 08:03
смысл с апи заморачиваться?

Просто пишу на C++, и заморачиваюсь как раз с бейсиком. Поэтому я и здесь.

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #8
Добавлено: 10.07.07 16:54
Вот так я удалял теги (=последние 128 байт) из мп3 файлов
Public Function RemTagsV1(File As String) As Boolean

Dim OriginalSize As Long, TagS As String * 3
Dim Handle As Long

Handle = CreateFile(File, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
If Handle = INVALID_HANDLE_VALUE Then
    RemTagsV1 = False
Else
    OriginalSize = GetFileSize(Handle, 0)

    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

Ключевое дело здесь - SetEndOfFile )))

Ответить

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



ICQ: 201446364 

Вопросов: 22
Ответов: 72
 Профиль | | #9 Добавлено: 15.07.07 11:52
Спасибо всем. Вот еще нашел
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


Работает все четко.

Ответить

Номер ответа: 10
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #10
Добавлено: 24.07.07 11:02
Можно не APPENDOM а OPEN for RANDOM

Ответить

Страница: 1 |

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



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