c# ile yapmak için kısa bir kod yazmıştım zamanında , az değiştirdim. buna benzer şekilde parçalayabilirsiniz.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace SADtest
{
class Program
{
const string kaynakDosya = "C:denemebig.xml";
const string dizinHedef = "C:deneme";
const int dosyaBytes = 5242880; // 5 MB
const int sinirBytes = 10485760; // 10 MB
static int dosyaID = 0;
static StringBuilder sb = new StringBuilder();
static void Main(string[] args)
{
xmlParcala();
}
static void xmlParcala()
{
if (!File.Exists(kaynakDosya))
{
throw new FileNotFoundException($"{kaynakDosya} dosyası yok!");
}
using (StreamReader sr = new StreamReader(kaynakDosya, Encoding.UTF8))
{
while (!sr.EndOfStream)
{
// her seferinde 1 satır oku
string satir = sr.ReadLine();
if (string.IsNullOrEmpty(satir))
{
continue;
}
// yazılacak dosya 5 mb olana kadar doldur
sb.AppendLine(satir);
// dosya 5 mb eşiğine ulaşır veya geçerse
if (sb.Length >= dosyaBytes)
{
// 5 mb oldu artık dosyayı kayıt edebiliriz.
// burda xml olduğu için çeşitli node kontrolleri yapılması gerekebilir.
// çünkü kesmenin doğru yerden yapılması gerekir.
// örneğe göre bu satırda aradığımız node şu şekilde bitiyorsa dosyayı kayıt edecek.
if (satir.EndsWith("</bitisnodesi>", StringComparison.Ordinal))
{
// 5 mb lık dosyayı yaz.
xmlYaz();
}
else if (sb.Length >= sinirBytes)
{
// 5mb oldu ancak bizim aradığımı kesilecek node henüz bulunamadı.
// döngü sürdükçe tampona atmaya devam edecek bu da tamponu büyütecek
// bunun önüne geçmek için sinirBytes ile 10 mb sınır verdik.
// burda dilerseniz bir Exception fırlatarak işlemi kesebilirsiniz.
throw new Exception("Max. sınıra ulaşıldı ancak node hala yok!");
}
}
}
// tamponda kalan varsa ayrı bir dosyaya yaz
if (sb.Length > 0)
{
// 5 mb lık dosyayı yaz.
xmlYaz();
}
}
}
static void xmlYaz()
{
// eşsiz bir xml dosyası yazılacak ve tampon sıfırlanacak.
dosyaID++;
string fullPath = $"{dizinHedef}{dosyaID}.xml";
File.WriteAllText(fullPath, sb.ToString());
sb = new StringBuilder();
}
}
}