Удалить часть байтов через Stream - C#
Формулировка задачи:
Как можно удалить часть байтов через Stream (или т.п.), что бы не нагружать оперативную память?
Решение задачи: «Удалить часть байтов через Stream»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace TestStream
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Результат проекта:");
Console.WriteLine();
_removeBytesInFileStream("D:\\Test.mp3", 0, 1024*1024);
Console.WriteLine();
Console.WriteLine("Чтобы продолжить, нажмите на любую клавишу...");
Console.ReadKey();
}
public static void _removeBytesInFileStream(string sourceFile, long start, long length)
{
string tempFileSource = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
try
{
using (FileStream ReadFileStream = new FileStream(sourceFile,FileMode.Open,FileAccess.Read))
{
Console.WriteLine("[{0}] Файл {1} был удачно открыт." ,DateTime.Now.ToLongTimeString(), Path.GetFileName(sourceFile));
using(FileStream WriteFileStream = new FileStream(tempFileSource,FileMode.Create,FileAccess.Write))
{
Console.WriteLine("[{0}] Файл {1} был удачно создан.", DateTime.Now.ToLongTimeString(), Path.GetFileName(tempFileSource));
if (start == 0)
{
Console.WriteLine("[{0}] Удаление массива по левой части FileStream.", DateTime.Now.ToLongTimeString());
byte[] buffer = new byte[16];
int lengthBytesEnd = 0;
ReadFileStream.Position = length;
do
{
lengthBytesEnd = ReadFileStream.Read(buffer,0,buffer.Length);
WriteFileStream.Write(buffer, 0, lengthBytesEnd);
} while (lengthBytesEnd != 0);
}
else if (start == ReadFileStream.Length - length)
{
Console.WriteLine("[{0}] Удаление массива по правой части FileStream.", DateTime.Now.ToLongTimeString());
byte[] buffer = new byte[16];
int lengthBytesEnd = 0;
do
{
lengthBytesEnd = ReadFileStream.Read(buffer, 0, buffer.Length);
WriteFileStream.Write(buffer, 0, lengthBytesEnd);
} while (lengthBytesEnd != 0 & ReadFileStream.Position <= start);
WriteFileStream.SetLength(start);
}
else
{
Console.WriteLine("[{0}] Удаление массива по центральной части FileStream.", DateTime.Now.ToLongTimeString());
byte[] buffer = new byte[16];
int lengthBytesEnd = 0;
do
{
lengthBytesEnd = ReadFileStream.Read(buffer, 0, buffer.Length);
WriteFileStream.Write(buffer, 0, lengthBytesEnd);
} while (lengthBytesEnd != 0 & ReadFileStream.Position <= start);
WriteFileStream.SetLength(start);
ReadFileStream.Position = start + length;
do
{
lengthBytesEnd = ReadFileStream.Read(buffer, 0, buffer.Length);
WriteFileStream.Write(buffer, 0, lengthBytesEnd);
} while (lengthBytesEnd != 0);
}
}
}
File.Delete(sourceFile); Console.WriteLine("[{0}] Файл {1} был удачно удалён.", DateTime.Now.ToLongTimeString(), Path.GetFileName(sourceFile));
File.Move(tempFileSource, sourceFile); Console.WriteLine("[{0}] Файл {1} был удачно перемещён.", DateTime.Now.ToLongTimeString(), Path.GetFileName(tempFileSource));
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}