Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Как укоротить файл? Добавлено: 02.03.10 00:59  

Автор вопроса:  normal
Подскажите, пож, как не создавая дополнительных временных файлов, удалить из открытого файла заданный плзициями фрагмент, в частности, концовку.

Ответить

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

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #1
Добавлено: 02.03.10 01:24
http://msdn.microsoft.com/en-us/library/aa365531(VS.85).aspx

Ответить

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



Вопросов: 3
Ответов: 7
 Профиль | | #2 Добавлено: 02.03.10 01:55
А нет ли чего подобного в VB?

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 02.03.10 17:07
неа, если имеются в виду стандартные функции VB6. Поэтому без WinAPI далеко не убежишь

Ответить

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



Вопросов: 3
Ответов: 7
 Профиль | | #4 Добавлено: 03.03.10 15:09
Спасибо Winand'у за консультацию. По причине моей некомпетентности в программировании
сочинил модуль ReWriteRazdF (ниже), выполняющий функцию замены фрагмента
в закрытом файле с использованием Temp-файла.
Аргументы
'- полное имя исходного файла;
'- полное имя вспомогательного файла;
'- начальный разделитель;
'- конечный разделитель;
'- номер фрагмента;
'- строка - новый фрагмент
Разделители в новом файле остаются.
Если Nach$= ””, то начинает с начала файла.
Если не находит Kon$, то удаляет фрагмент до конца файла и заменяет его новым.
Использует модули:
FindStrOpenF(Nom, Nach$, nBlok) – вычисляет число сдвигов позиций до начала разделителя
(если не находит, то -1). Переводит текущую позицию на следующую
после разделителя. Читает файл блоками длины nBlok.
DelF – уничтожитель файла.
Проверил в разных случаях - работает.
Function ReWriteRazdF(IdFile$, DopFile$, Nach$, Kon$, nomRazd, Sstr$)
lnNach = Len(Nach$)
lnKon = Len(Kon$)
m1 = 1
iind = False
nBlok = 1 'длина считываемых блоков
Nom = FreeFile
Open IdFile$ For Binary As #Nom
i = 0
nBlok = 1
Do While Not EOF(1) And i < nomRazd
n1 = FindStrOpenF(Nom, Nach$, nBlok)
i = i + 1
If n1 > 0.5 Then
m1 = m1 + n1 + lnNach
Seek #Nom, m1
If i >= nomRazd Then iind = True
End If
Loop
If iind Then
n2 = FindStrOpenF(Nom, Kon$, nBlok)
Seek #Nom, 1
Nom1 = FreeFile
Open DopFile$ For Binary As #Nom1
For i = 1 To m1 - 1
z$ = Input(1, #Nom)
Put #Nom1, , z$
Next
Put #Nom1, , Sstr$

If n2 >= 0 Then
m2 = m1 + n2
Seek #Nom, m2
Do While Not EOF(Nom)
z$ = Input(1, #Nom)
Put #Nom1, , z$
Loop
End If

Close #Nom
Close #Nom1
DelF (IdFile$)
Name DopFile$ As IdFile$
s = 1
Else
Close #Nom
s = 0
End If
ReWriteRazdF = s

End Function

Ответить

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



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #5 Добавлено: 03.03.10 22:22
Вычитать нужный фрагмент и сохранить под темже именем не судьба?
Извиняюсь если я неправильно понял, но помоему задачка для первого урока программирования.

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #6
Добавлено: 04.03.10 01:23
  1. Option Explicit
  2. Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileW" (ByVal lpFileName As Long, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  3. Private Declare Function GetFileSize Lib "kernel32.dll" (ByVal hFile As Long, ByRef lpFileSizeHigh As Long) As Long
  4. Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
  5. Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
  6. Private Declare Function SetEndOfFile Lib "kernel32.dll" (ByVal hFile As Long) As Long
  7. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  8. Private Const GENERIC_WRITE = &H40000000
  9. Private Const GENERIC_READ = &H80000000
  10. Private Const OPEN_EXISTING As Long = 3
  11. Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
  12. Private Const INVALID_HANDLE_VALUE = -1
  13. Private Const FILE_BEGIN As Long = 0
  14. 'Private Const FILE_CURRENT As Long = 1
  15. 'Private Const FILE_END As Long = 2
  16.  
  17. Private Sub Form_Load()
  18.     Dim handle As Long, size As Long, magic(2) As Byte
  19.     handle = CreateFile(StrPtr("C:\zzz"), GENERIC_READ Or GENERIC_WRITE, 0, 0, _
  20.             OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) 'Открываем существующий файл
  21.     If handle <> INVALID_HANDLE_VALUE Then
  22.         size = GetFileSize(handle, 0) 'Узнаем размер файла
  23.         SetFilePointer handle, size - 128, 0, FILE_BEGIN 'Переходим к 128ому байту с конца
  24.         ReadFile handle, magic(0), 3, 0, 0  'Считываем 3 байта
  25.         If StrConv(magic, vbUnicode) = "TAG" Then   'Если это идентификатор ID3V1
  26.             SetFilePointer handle, size - 128, 0, FILE_BEGIN 'Переходим к 128ому байту с конца
  27.             SetEndOfFile handle 'Ставим здесь конец файла
  28.         End If
  29.         CloseHandle handle 'Закрываем файл
  30.     End If
  31. End Sub

Ответить

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



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #7 Добавлено: 04.03.10 01:54
Неслабый такой примерчик :-)

Ответить

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



Вопросов: 3
Ответов: 7
 Профиль | | #8 Добавлено: 04.03.10 12:14
Спасибо, Winand. Этого мне надолго хватит для развития и совершенствования в этом
направлении.
Без знания техники программирования для решения отдельных возникающих задач приходится копать лопатой вместо использования этой замечательной техники.

Ответить

Страница: 1 |

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



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