Pergunta

No meu aplicativo, o usuário seleciona um grande arquivo (> 100 MB) em sua unidade. Desejo que o programa pegue o arquivo que foi selecionado e pique em partes arquivadas que são 100 MB ou menos. Como isso pode ser feito? o que Bibliotecas e arquivo formato Devo usar? Você poderia me dar algum código de exemplo? Depois que a primeira parte arquivada de 100 MB for criada, vou fazer o upload para um servidor, então vou fazer o upload da próxima peça de 100 MB e assim por diante até que o upload seja concluído. Depois disso, de outro computador, vou baixar todas essas peças arquivadas, e então desejo Conecte -os ao arquivo original. Isso é possível com as bibliotecas 7ZIP, por exemplo? Obrigado!

ATUALIZAR: Desde a primeira resposta, acho que vou usar o SevenzipSharp, e acredito que agora entendo como dividir um arquivo em peças arquivadas de 100 MB, mas ainda tenho duas perguntas:

  1. É possível criar a primeira parte arquivada de 100 MB e fazer upload antes de criar a próxima parte de 100 MB?
  2. Como você extrai um arquivo com setezipsharp de vários arquivos divididos?

Atualização #2: Eu estava apenas brincando com a GUI de 7 zip e criando arquivos de vários volumes/divididos, e descobri que a seleção do primeiro e a extração dele extrairá o arquivo inteiro de todos os arquivos divididos. Isso me leva a acreditar que os caminhos para as partes subsequentes estão incluídos no primeiro (ou é consecutivo?). No entanto, não tenho certeza se isso funcionaria diretamente no console, mas vou tentar isso agora e ver se ele resolve a pergunta nº 2 da primeira atualização.

Foi útil?

Solução

Dar uma olhada em SevenzipSharp, você pode usá -lo para criar seus arquivos Spit 7Z, fazer o que quiser para carregá -los e extraí -los no lado do servidor.

Para dividir o arquivo, olhe para o SevenZipCompressor.CustomParameters Membro, passando em "V100m". (Você pode encontrar mais parâmetros no arquivo 7-zip.chm do 7ZIP)

Outras dicas

Você pode dividir os dados em 100 MB "pacotes" primeiro e depois passar cada pacote para o compressor, fingindo que eles são apenas arquivos separados.

No entanto, esse tipo de compactação geralmente é baseado em fluxos. Enquanto a biblioteca que você estiver usando fará sua E/S por meio de uma classe derivada de fluxo, seria muito simples implementar seu próprio fluxo que "empacote" os dados da maneira que você quiser em tempo real - pois os dados são transmitidos seu método write () você o escreve em um arquivo. Quando você excede 100 MB nesse arquivo, simplesmente fecha esse arquivo e abre um novo e continua escrevendo.

Qualquer uma dessas abordagens permitiria fazer o upload facilmente de um "pacote" enquanto continuaria comprimindo o próximo.

editar

Só para ficar claro - a descompressão é apenas a sequência reversa do acima, então, depois de funcionar o código de compactação, a descompressão será fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top