purebasic.info

PureBasic forum
Текущее время: Вс ноя 19, 2017 9:42 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Слияние файлов
СообщениеДобавлено: Вт июл 11, 2017 10:31 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Пётр, или кто-то другой, проверьте пожалуйста следующий код:
Код:
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
Define.s BigFile = "c:\my big file.dat"
Define.s SmallFiles = "c:\my smallfile_"
 
Define.i BF, SF, length, count, bufSize = 100 * 1024 * 1024
Define *buf = AllocateMemory(bufSize)
 
For count = 1 To 8
  SF = ReadFile(#PB_Any, SmallFiles+Str(count))
  If SF
    While Not Eof(SF)
      length = ReadData(SF, *buf, bufSize)
      If length
        BF = OpenFile(0, BigFile)
        If BF
          FileSeek(0, Lof(0))
          WriteData(0, *buf, length)
          CloseFile(0)
        EndIf
      EndIf
    Wend
    CloseFile(SF)
  EndIf
Next
 
FreeMemory(*buf)


Корректно? Или можно по-другому? И как сделали бы вы?
Предварительно большой файл разбился на восемь частей, отсюда count(max)=8.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Слияние файлов
СообщениеДобавлено: Вт июл 11, 2017 10:41 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11053
Благодарил (а): 4 раз.
Поблагодарили: 374 раз.
knower писал(а):
И как сделали бы вы?
Я бы не открывал много раз один и тот же файл.
Код:
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
Define.s BigFile = "c:\my big file.dat"
Define.s SmallFiles = "c:\my smallfile_"
 
Define.i BF, SF, length, count, bufSize = 100 * 1024 * 1024
Define *buf = AllocateMemory(bufSize)
 
If *buf
 
  BF = OpenFile(0, BigFile)
  If BF
    FileSeek(0, Lof(0))
   
    For count = 1 To 8
      SF = ReadFile(#PB_Any, SmallFiles+Str(count))
      If SF
        While Not Eof(SF)
          length = ReadData(SF, *buf, bufSize)
          If length>0
            WriteData(0, *buf, length)
          EndIf
        Wend
        CloseFile(SF)
      EndIf
    Next
   
    CloseFile(0)
  EndIf
 
  FreeMemory(*buf)
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Слияние файлов
СообщениеДобавлено: Вт июл 11, 2017 10:54 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
Спасибо, Пётр.

Но у меня будет ещё один вопрос: как вычислить этот самый count(max)? Понятно, что нужно перебрать/просканировать все файлы в папке, а дальше-то что? Сравнивать имена? Допустим имеется папка и заранее неизвестно количество частей. Их может быть, например 20 или более. К тому же разбиваться будут несколько больших файлов. И всё в одной папке. Или же проще при разбиении к каждому файлу комментарий записывать из скольки частей состоит тот или иной файл?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Слияние файлов
СообщениеДобавлено: Вт июл 11, 2017 2:54 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6189
Благодарил (а): 16 раз.
Поблагодарили: 169 раз.
Пункты репутации: 48
Например Total Commander дает всем частям оригинальное имя файла, а вот расширение меняет на 001, 002, 003 и т.д.
+ создает файл со служебной информацией, где есть оригинальное имя файла с правильным расширением, его настоящий размер и хеш в виде crc32. Этот файл имеет имя разбиваемого файла и расширение .crc
При таком подходе ошибки исключены.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Слияние файлов
СообщениеДобавлено: Вт июл 11, 2017 4:26 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 381
Благодарил (а): 47 раз.
Поблагодарили: 18 раз.
Пункты репутации: 10
kvitaliy, спасибо за совет. У меня было немного другое представление о решении.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB