如何在C#中将大文件拆分为块?
|
我正在通过电线制作一个简单的文件传输发送器和接收器应用程序。到目前为止,我所拥有的是发送方将文件转换为字节数组,并将该数组的块发送给接收方。
这适用于最大为
256mb
的文件,但该行上面的任何内容:
byte[] buffer = StreamFile(fileName); //This is where I convert the file
Throws a System out of memory exception.
我正在寻找一种读取大块文件然后将其写入的方法,而不是将整个文件加载到ѭ2中。我如何用3英镑来做这个?
编辑:
抱歉,到目前为止,这是我糟糕的代码:
private void btnSend(object sender, EventArgs e)
{
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] fileName = Encoding.UTF8.GetBytes(fName); //file name
byte[] fileData = null;
try
{
fileData = StreamFile(textBox1.Text); //file
}
catch (OutOfMemoryException ex)
{
MessageBox.Show(\"Out of memory\");
return;
}
byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //length of file name
clientData = new byte[4 + fileName.Length + fileData.Length];
fileNameLen.CopyTo(clientData, 0);
fileName.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileName.Length);
clientSock.Connect(\"172.16.12.91\", 9050);
clientSock.Send(clientData, 0, 4 + fileName.Length, SocketFlags.None);
for (int i = 4 + fileName.Length; i < clientData.Length; i++)
{
clientSock.Send(clientData, i, 1 , SocketFlags.None);
}
clientSock.Close();
}
这就是我的接收方式(代码来自教程)
public void ReadCallback(IAsyncResult ar)
{
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
Thread.Sleep(1000);
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
receivedPath = fileName;
flag++;
}
if (flag >= 1)
{
BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
if (flag == 1)
{
writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
flag++;
}
else
writer.Write(state.buffer, 0, bytesRead);
writer.Close();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
else
{
Invoke(new MyDelegate(LabelWriter));
}
}
我只是真的想知道如何读取大块文件,所以我不需要将其转换为字节。
感谢到目前为止的答复,我想我已经开始明白了:D
没有找到相关结果
已邀请:
2 个回复
爆山
(我倾向于使用类似16K的东西)。请注意,呼叫“ 6”可能最终会读取比您要求的小的数量。如果您使用固定的块大小并且需要整个块在内存中,那么您当然可以使用该大小的数组。 在不知道如何发送文件的情况下,很难就如何构建代码提供很多建议,但是可能是这样的:
如果我更清醒,可能会找到一种更具可读性的编写方式,但是现在就可以了。一种选择是从中间部分提取另一种方法:
蔬谢窗港