mtyrce
asked on
C#.NET - Problems with stream read/write timing glitches
I'm trying to read from a Stream and write to another Stream. The output stream is a disk file, whereas the input stream is one provided by SharpZip (http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx).
I've put a BinaryReader on the SharpZip Stream and a BinaryWriter on the disk file's handle.
Whenever the stream data is copied I run into glitches that result in truncated files, 0-byte files, files that are closed before they've started to be written, etc. In general it appears that BinaryWriter is executing in a different, slower thread than the read operations. However, I haven't put any multithreading code into my app.
Here is applicable code:
Outfile = new FileStream((UT2004Location + en.Value.ToString()), ((bOverwrite) ? (FileMode.Create) : (FileMode.CreateNew)), FileAccess.Write);
Output = new BinaryWriter(Outfile);
// Read in data
Instream = Infile.GetInputStream(Infi le.GetEntr y(en.Key.T oString()) );
Input = new BinaryReader(Instream);
Size = 2048;
while (true)
{
Size = Input.Read(Buffer, 0, Buffer.Length);
if (Size > 0)
{
Output.Write(Buffer);
}
else
{
break;
}
}
Input.Close();
Instream.Close();
Output.Close();
Outfile.Close();
Thanks in advance,
mtyrce
I've put a BinaryReader on the SharpZip Stream and a BinaryWriter on the disk file's handle.
Whenever the stream data is copied I run into glitches that result in truncated files, 0-byte files, files that are closed before they've started to be written, etc. In general it appears that BinaryWriter is executing in a different, slower thread than the read operations. However, I haven't put any multithreading code into my app.
Here is applicable code:
Outfile = new FileStream((UT2004Location
Output = new BinaryWriter(Outfile);
// Read in data
Instream = Infile.GetInputStream(Infi
Input = new BinaryReader(Instream);
Size = 2048;
while (true)
{
Size = Input.Read(Buffer, 0, Buffer.Length);
if (Size > 0)
{
Output.Write(Buffer);
}
else
{
break;
}
}
Input.Close();
Instream.Close();
Output.Close();
Outfile.Close();
Thanks in advance,
mtyrce
When you wroite to your BinaryStream, try doing this :
Output.Write(Buffer,0,Size );
instead of this :
Output.Write(Buffer);
Output.Write(Buffer,0,Size
instead of this :
Output.Write(Buffer);
ASKER
Thanks for the tips everyone,
I figured it out. It looks like it was two things:
1. I didn't Output.Flush() before Output.Close(), and
2. I shouldn't have had Input.Close() and Instream.Close() (those gave me errors that the next file could not be read since it was already closed.)
Sorry for wasting everyone's time, I'm a .NET newbie. :(
Going to request a refund in Community Service.
I figured it out. It looks like it was two things:
1. I didn't Output.Flush() before Output.Close(), and
2. I shouldn't have had Input.Close() and Instream.Close() (those gave me errors that the next file could not be read since it was already closed.)
Sorry for wasting everyone's time, I'm a .NET newbie. :(
Going to request a refund in Community Service.
I have no problem with that.
However, I would still recommend the change I suggested.
Cheers.
However, I would still recommend the change I suggested.
Cheers.
ASKER
ozymanidias, that was what the line was before; I messed with it during debugging attempts. I'll change it back if it's better for some reason.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Maybe SharpZip is doing some multi threading..check it out is functionality
-Aaron