J'essaie de créer un programme pour couper des fichiers selon une taille donnée (le couper tout les 10 KO par exemple).
Voici la fonction :
Dim fileSize As Long = File.ReadAllBytes(FileTextBox.Text).LongLength
If SplitByPartsRadioButton.Checked Then
Else
If Not SplitBySizeNumericUpDown.Value > fileSize Then
Dim splitSize As Long = 0
If SizeBRadioButton.Checked Then
splitSize = SplitBySizeNumericUpDown.Value
ElseIf SizeKBRadioButton.Checked Then
splitSize = SplitBySizeNumericUpDown.Value * 1024
ElseIf SizeMBRadioButton.Checked Then
splitSize = SplitBySizeNumericUpDown.Value * 1048576
Else
splitSize = SplitBySizeNumericUpDown.Value * 1073741824
End If
Dim myFileStream As New FileStream(FileTextBox.Text, FileMode.Open, FileAccess.Read, FileShare.Read, CInt(fileSize))
Dim partsNumber As Long = 0
For i As Long = 0 To fileSize Step splitSize
If Not splitSize > fileSize - (partsNumber * splitSize) Then
Dim myByteArray(splitSize) As Byte
myFileStream.Read(myByteArray, i, splitSize)
File.WriteAllBytes(FileTextBox.Text.Replace(Path.GetExtension(FileTextBox.Text), ".split" & partsNumber), myByteArray)
Else
Dim myByteArray(fileSize - (partsNumber * splitSize)) As Byte
myFileStream.Read(myByteArray, i, fileSize - (partsNumber * splitSize))
File.WriteAllBytes(FileTextBox.Text.Replace(Path.GetExtension(FileTextBox.Text), ".split" & partsNumber), myByteArray)
End If
partsNumber += 1
Next i
MessageBox.Show("Done!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("Size too large!!!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End If
Donc le programme récupère la taille du fichier, s'il reste assez d'octets pour le couper comme on l'a demandé on exécute ce code :
If Not splitSize > fileSize - (partsNumber * splitSize) Then
Dim myByteArray(splitSize) As Byte
myFileStream.Read(myByteArray, i, splitSize)
File.WriteAllBytes(FileTextBox.Text.Replace(Path.GetExtension(FileTextBox.Text), ".split" & i), myByteArray)
Aucun problème tout fonctionne bien, quand c'est la 1ère boucle !
La deuxième fois qu'il passe dans ce If, j'ai droit à :
Citation : Visual Studio
Offset et length étaient hors limites pour ce tableau ou bien le nombre est supérieur au nombre d'éléments de l'index à la fin de la collection source.
Sinon, il ne reste plus assez d'octets, on bascule dans le Else :
Else
Dim myByteArray(fileSize - (partsNumber * splitSize)) As Byte
myFileStream.Read(myByteArray, i, fileSize - (partsNumber * splitSize))
File.WriteAllBytes(FileTextBox.Text.Replace(Path.GetExtension(FileTextBox.Text), ".split" & partsNumber), myByteArray)
Mais là, sur la ligne du Read, y'a pas moyen, il me sort toujours cette erreur :
Citation : Visual Studio
Offset et length étaient hors limites pour ce tableau ou bien le nombre est supérieur au nombre d'éléments de l'index à la fin de la collection source.
Pourtant toutes les tailles ont l'air d'être bonnes, non ?
Quelqu'un aurait une idée du problème ?
Merci d'avance !
EDIT : je me suis compliqué la vie ! En fait, l'offset s'avance automatiquement et moi je le faisais aussi de mon côté. Donc l'offset avançait du double de ce que je voulais. Avec de grands nombres, forcément l'index était en dehors du tableau.
Couper un fichier en plusieurs parties
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.