Существуют утилиты для разделения файлов, которые могут превзойти ваше решение - например, поиск "разбить файл на строку".
Если они не подходят, есть решения для загрузки всего исходного файла в память и последующей записи файлов, но это, вероятно, не подходит, учитывая размер исходного файла.
С точки зрения улучшения вашего кода, незначительным улучшением будет генерация пути к целевому файлу (а также прояснение путаницы между исходным filePath, который вы используете, и целевыми файлами). Вам не нужно повторно устанавливать расширение исходного файла каждый раз в цикле.
Второе улучшение (и, возможно, более значительное улучшение - как отмечено комментаторами) - это то, как вы записываете файлы назначения - у них, похоже, различное количество строк от источника (значение в каждой записи newFiles
), которые Вы указываете, что вы хотите в отдельных файлах назначения? Поэтому я бы посоветовал для каждой записи прочитать весь исходный файл, относящийся к следующему файлу назначения, , а затем выводить пункт назначения, а не многократно открывать файл назначения. Вы можете «собрать» строки в StringBuilder / List и т. Д. - в качестве альтернативы просто записать их прямо в файл назначения (но только открыв его один раз )
public void SplitFiles(int[] newFiles, string sourceFilePath, int processorCount)
{
string sourceDirectory = System.IO.Path.GetDirectoryName(sourceFilePath);
string sourceFileName = System.IO.Path.GetFileNameWithoutExtension(sourceFilePath);
string extension = System.IO.Path.GetExtension(sourceFilePath);
using (StreamReader Reader = new StreamReader(sourceFilePath))
{
for (int i = 0; i < newFiles.Length; i++)
{
string destinationFileNameWithExtension = string.Format("{0}{1}{2}", sourceFileName, i, extension);
string destinationFilePath = System.IO.Path.Combine(sourceDirectory, destinationFileNameWithExtension);
if (!File.Exists(destinationFilePath))
{
// Read all the lines relevant to this destination file
// and temporarily store them in memory
StringBuilder destinationText = new StringBuilder();
for (int x = 0; x < newFiles[i]; x++)
{
destinationText.Append(Reader.ReadLine());
}
DataWriter(destinationFilePath, destinationText.ToString());
}
else
{
return;
}
}
}
}
private static void DataWriter(string destinationFilePath, string content)
{
using (StreamWriter sr = new StreamWriter(destinationFilePath))
{
{
sr.Write(content);
}
}
}