[C#] Split file by size or by Lines

Magari può essere utile questo metodo facile facile che permette di dividere un qualsiasi file (binario o testo) in un numero di parti definite.

SplitFileByByte
In questo caso, non vengono considerate le righe ma i byte del file e viene splittato in base al numero richiesto.

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]public void SplitFileByByte(string FileInputPath, string FolderOutputPath, int OutputFiles)
{
Byte[] byteSource = System.IO.File.ReadAllBytes(FileInputPath);
FileInfo fiSource = new FileInfo(FileInputPath);
int partSize = (int)Math.Ceiling((double)(fiSource.Length / OutputFiles));
int fileOffset = 0;
string currPartPath;
FileStream fsPart;
int sizeRemaining = (int)fiSource.Length;

for (int i = 0; i < OutputFiles; i++)
{
currPartPath = FolderOutputPath + "\\" + fiSource.Name + "." + String.Format(@"{0:D4}", i) + ".part";
if (!File.Exists(currPartPath))
{
fsPart = new FileStream(currPartPath, FileMode.CreateNew);
sizeRemaining = (int)fiSource.Length – (partSize * i);
if (sizeRemaining < partSize) partSize = sizeRemaining;

while (true)
{
if (!(byteSource[partSize * 2] == 110 && byteSource[partSize * 2 + 1] == 62)) partSize++;
else
{
partSize += 2;
break;
}
}

fsPart.Write(byteSource, fileOffset, partSize);
fsPart.Close();
fileOffset += partSize;
}
}
}[/code]

SplitFileByLine
In questo caso essendo il file da splittare un xml con i blocchi da 3 righe ognuno, si considera questa caratteristica, pertanto il file viene diviso in blocchi di 3 righe ognuno aggiungendo poi header e footer.

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]public void SplitFileByLine(int part, string outputFolder)
{
ArrayList lines = new ArrayList();
StreamReader sr = null;
try
{
sr = new StreamReader(outputFolder + "file.xml");
while (!sr.EndOfStream) lines.Add(sr.ReadLine());
/* rimuovo le intestazioni e il footer */
lines.RemoveAt(0);
lines.RemoveAt(0);
lines.RemoveAt(lines.Count – 1);

if (lines.Count >= 50)
{
StreamWriter sw = null;

int div = lines.Count / part;
/* preparo lo split in modo tale che le sezioni
* non vengano mai divise. Sono 3 righe a blocco!
*/
while (div % 3 != 0) div++;
int cont = 0;

for (int i = 0; i < part; i++)
{
int tot = 0;
try
{
sw = new StreamWriter(outputFolder + "part_" + i + ".xml");

/* intestazioni */
sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sw.WriteLine("<locations>");

tot = div * (i + 1);
for (int k = cont; k < tot; k++) sw.WriteLine(lines[k]);
} //try
catch { }
finally
{
cont = tot;
/* scrivo footer */
sw.WriteLine("</locations>");
sw.Flush();
sw.Close();
} //finally
} //for
} //if
} //try
catch { }
}[/code]

enjoy!

[ref -> albertopasca.it]

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.