Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Обрезать файл без перезаписи. Добавлено: 29.01.06 19:48  

Автор вопроса:  Queen
Подскажите плиз.

Есть файлик весом 100 гигабайт. (видео Avi)
Необходимо обезать его с конца на 60 гигов. (уснул во время захвата )

Всяки возможные Программы которые предлагают пересохранить файл не подходят , места больше нету.
ЕСть VB код, но он работает только с файлами меньше 4 гигов.
А Как бы кастрировать мой файлик .

имеющийся в загажнике код, представленный ниже, не работает с файлами больше 4 гигов.


Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, 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
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const OPEN_EXISTING = 3
Const FILE_BEGIN = 0
Const INVALID_HANDLE_VALUE = -1


Private Sub Кнопка0_Click()
Dim FileString As String

nDescriptor = FreeFile
Open "f:\_Untitled.psd" For Binary As #nDescriptor
Get #nDescriptor, , FileString '// грузим всю строку

'// Проверку на длину файла оставь себе

'// Реализуем обрезание строки на 2 Мб
FileString = Left$(FileString, Len(FileString) - (2000))
Put #nDescriptor, , FileString

Close nDescriptor
End Sub

Ответить

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

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



Вопросов: 10
Ответов: 11
 Профиль | | #1 Добавлено: 29.01.06 19:52
сорри спплю находу вот верный код


Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, 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
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const OPEN_EXISTING = 3
Const FILE_BEGIN = 0
Const INVALID_HANDLE_VALUE = -1


Private Sub Кнопка0_Click()
Dim hf As Long
hf = CreateFile("f:\file.avi", GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)
If hf = INVALID_HANDLE_VALUE Then
MsgBox ("Ошибка при открытии";)
Else
' Встать на 10 байт от начала
Call SetFilePointer(hf, 1024, 0, FILE_BEGIN)
' Обрезать файл на этом месте
Call SetEndOfFile(hf)
' Теперь длина файла стала 10
Call CloseHandle(hf)
End If

End Sub

Ответить

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


 

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

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 30.01.06 00:06
Мне кажеться дело в ресурсах компа, сколько там оперативки итп... 4
гига в оперативу не влезит кешировать процесс долгий наверное поэтому
и загинается код...

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 30.01.06 04:55
Попробуй CreateFile("f:\file.avi", GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)

Возможно, стоит попробовать также флаги FILE_FLAG_NO_BUFFERING (но тогда см. правила перемещения по такому файлу) и FILE_FLAG_WRITE_THROUGH...

Ответить

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



Вопросов: 10
Ответов: 11
 Профиль | | #4 Добавлено: 30.01.06 08:34
Сегодня на свежую голову понял в чем проблема
требуется получить файл 85 899 345 920 или 80 гигов
На Access (я на нем сижу )и на VB тоже вроде - нету таких чисел
во всяком случае если стоку определять так


Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long


то


Call SetFilePointer(hf, 85899345920 , 0, FILE_BEGIN)


вызывает ошибку а при компиляции число 85899345920 становится 85899345920#

а на Decimal он ругается.

Ответить

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



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 30.01.06 09:25
Нды...
Не думал, что проблема в этом...

Функция не абсолютно точная, но для этой цели сойдёт...
Private Function Double2LARGE(ByVal d As Double) As LARGE_INTEGER
  d = d / 2684354560#
  
  ;Double2LARGE.High = Int(d)
  d = d - Double2LARGE.High
  
  If d >= 0.5 Then Double2LARGE.Low = (1 - d) * 2684354560# Else Double2LARGE.Low = d * 2684354560#
End Function


dim l as LARGE_INTEGER
l=Double2LARGE(85899345920#)
SetFilePointer hf, l.low, l.high, FILE_BEGIN

Ответить

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



Вопросов: 10
Ответов: 11
 Профиль | | #6 Добавлено: 30.01.06 10:23
GSerg

Спасибо, дома попробую..

Никогда не общался с большими числами, Long за глаза хватало, вот и застрял.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 30.01.06 13:21
Тебе нужно 64-битное число? Вот посмотри я написал модуль специальный.
http://basicproduction.nm.ru/BPALU.rar

Но, насколько я знаю, в файловых API функциях есть два приёмника для числа. Один под старший Dword и один под младший.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 30.01.06 13:45
Подключаешь модуль BPALU к своему проекту и нижеследующим кодом получаешь старшую и младшую части.

Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, RetVal As Long)

Private Sub Form_Load()
 Dim A As BITFLD
 Initialize
 VAL64 A, "85899345920"
 
 Dim ValHigh As Long, ValLow As Long
 GetMem4 VarPtr(A.Bytes(4)), ValHigh
 GetMem4 VarPtr(A.Bytes(0)), ValLow
 
 MsgBox "High=" & Hex$(ValHigh), , "Low=" & Hex$(ValLow)
End Sub

Ответить

Номер ответа: 9
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #9
Добавлено: 01.02.06 15:11
А нельзя второй параметр в функции SetFilePointer объявить как Double и передавать туда тип double? Хотя вряд ли, официально в прототипе long написано...

Ну и ещё как вариант прямой доступ к диску...

Ответить

Номер ответа: 10
Автор ответа:
 [root]



Вопросов: 45
Ответов: 1212
 Web-сайт: bit.pirit.info
 Профиль | | #10
Добавлено: 13.02.06 19:42
2Queen:
       Это что ж за кино такое длиннючеее?
       в принципе, а почему бы по 4 и не отрезать несколько раз, или
       там по одному до нужной длинны

Ответить

Страница: 1 |

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



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