|
Cross posted homework question with crap subject. Why should anyone help you. Do your own work.
Bob
Ashfield Consultants Ltd
|
|
|
|
|
Keep your responses in the thread that you already have created, instead of creating a new thread.
People have raised questions about how you expect someone to answer to your question. Your only chance of getting some answers at all is to respond to these questions and explain what your question really is. Ignoring those replies and just asking louder will not get you any answers.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Hi.
I'd like to write a program, which would delete first 55 bytes from a file. Files size varies from 1MB to 250MB, that means, the files are big...
I started by opening a file as a text file... but that doesnt work for big files.
Could you please help me with some sample code? Or somethin similar?
Thanks in advance!
Regards,
Matjaž
|
|
|
|
|
You can't delete the first n bytes. You need to read the whole thing, then write from n to the end, in a new file ( use the same file path to overwrite ). File.ReadAllBytes and File.WriteAllBytes are probably what you need.
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
Ok... thanks And where can i edit those readed bytes?
byte[] x= File.ReadAllBytes("C:\\test.pdf");
I didnt find how to remove or edit the array of bytes... or i just forgot how to
File.WriteAllBytes("C:\\test.pdf", x);
Thanks for your fast answer!
Regards,
Matjaž
|
|
|
|
|
max00slo wrote: I didnt find how to remove or edit the array of bytes... or i just forgot how to
You can't remove part of an array. You would have to create a new array and copy the data that you want to keep. That would use twice as much memory, so that's not a very good idea.
Use a FileStream to write part of the array, instead of the WriteAllBytes method.
An alternative, if you don't want to keep the entire file in memory, is to read smaller blocks from the file and write to a temporary file.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Ok, lets say we forget about the filesizes...
Shouldnt it work this way?
byte[] x= File.ReadAllBytes("C:\\test.pdf");
byte[] temp = new byte[x.Length-55];
long tempx=1;
for (long i = 56; i <= x.LongLength; i++)
{
temp[tempx] = x[i];
tempx++;
}
File.WriteAllBytes("C:\\test.pdf", temp);
by my logic and the newbie knowing of c#, this should work? but it doesnt. it goes outside the new array bounds. tried creating the new array without predefined size but its a no-go.
any ideas?
Regards,
Matjaž
|
|
|
|
|
1. Indexes in c# start from 0, not 1.
2. If you don't need first 55 bytes use BinaryReader class. Read first 55 bytes and discard them. Then read next portion of bytes and write them to new file until you get to the end of the file.
|
|
|
|
|
i know that just tried with the number 1 if it makes any difference.
still... why is it out of bounds?
Regards,
Matjaž
|
|
|
|
|
If you knew it, you would know that x[56] refers to 57th element and x[x.LongLength] will be out of bound. Why are you ignoring my suggestion to use BinaryReader/BinaryWriter ?
|
|
|
|
|
Ignore this post... as now i get it.. i trully was ignoring your post went to fast through the text u wrote
Thanks for the answers all of you.
And thank you Giorgi, as you have, once again, solved my problem.
Have a nice day
Regards,
Matjaž
modified on Monday, November 24, 2008 5:49 AM
|
|
|
|
|
I'm not insisting but if I were you I would use BinaryReader/BinaryWriter. If you need to replace first 55 bytes do something like this:
1. Write 55 bytes with BinaryWriter
2. Read 55 bytes by BinaryReader. Don't do anything with them, just read.
3. Read other bytes from file by BinaryReader and write them with BinaryWriter.
|
|
|
|
|
Thats it... i'm almost on giving up on programming, as im going nowhere.
Could you, please, for my better understaning, write me this piece of code for this problem... i just dont get it.
You also said that write first 55 bytes. Ok, but there shouldnt be those first 55 bytes.
This program is ment for this: i got back around 20 PDF files and all of them have 55 bytes at the beggining which makes them fail on load in a viewer. Yes, i would already fix them by hand, but if the problem appears again it would be better to have an app. to do that for me.
Once again... sample would be the best for me. A working one and tested ... which would delete first 55 bytes or rewrite the file without those 55 bytes...
Bah... im desperate :/
Regards,
Matjaž
|
|
|
|
|
I thought you need to change first 55 bytes. If not just remove step one from my previous post.
|
|
|
|
|
that means nothing from a sample?
Regards,
Matjaž
|
|
|
|
|
OK, here you go:
int length;
byte[] bt=new byte[1024];
FileStream input=new FileStream("in.pdf", FileMode.Open);
FileStream output=new FileStream("out.pdf", FileMode.Create);
BinaryReader rd= new BinaryReader(input);
BinaryWriter rw=new BinaryWriter(output);
rd.Read(bt, 0, 55);
while(true)
{
length=rd.Read(bt, 0, 1024);
if (length==0) break;
rw.Write(bt);
}
rd.Close();
rw.Close();
input.Close();
output.Close();
It should work. By the way, it's better to use using block to make sure that streams are always closed.
modified on Monday, November 24, 2008 8:36 AM
|
|
|
|
|
With the indexes fixed:
byte[] x= File.ReadAllBytes("C:\\test.pdf");
byte[] temp = new byte[x.Length - 55];
long tempx = 0;
for (long i = 55; i < x.LongLength; i++)
{
temp[tempx] = x[i];
tempx++;
}
File.WriteAllBytes("C:\\test.pdf", temp);
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Great!!! This is what i needed. Works perfect!! Thanks Guffa for taking your time and looking at my code.
Thanks again to all of you, again, for taking your time and trying to help.
Regards,
Matjaž
|
|
|
|
|
While Guffa's solution works, it's about three-six times slower depending on input size than my solution.
|
|
|
|
|
Maybe, but i dont know how to use it, thats why i was asking for a sample.
I coded the program the way i knew, but got a problem and Guffa fixed my index out of bounds problem... but your solution... i dont know how to use it.
If u want, u can write your sample/example... but if you dont want to, this code is fine for me.
Regards,
Matjaž
|
|
|
|
|
|
Dont know how could i miss your reply, but ok. Tnx.
Learn by myself? I like problems a lot... and i try to get my knowledge on my own and with help from someone else. Then i combine these two things and most of the times, i get good results. For a begginer, ofcourse. This is my way of learning...
Regards,
Matjaž
|
|
|
|
|
Ok, but with using your code, i get this error:
************* Exception Text **************<br />
System.IO.IOException: The process cannot access the file 'C:\Documents and Settings\milos\My Documents\Visual Studio 2008\Projects\Brisanje Bytov iz datotek\Brisanje Bytov iz datotek\bin\Debug\New Folder\export_104974_00001484.pdf.e3.blob.pdf' because it is being used by another process.<br />
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)<br />
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)<br />
at System.IO.FileStream..ctor(String path, FileMode mode)<br />
at Brisanje_Bytov_iz_datotek.Form1.button2_Click(Object sender, EventArgs e) in C:\Documents and Settings\milos\My Documents\Visual Studio 2008\Projects\Brisanje Bytov iz datotek\Brisanje Bytov iz datotek\Form1.cs:line 37<br />
at System.Windows.Forms.Control.OnClick(EventArgs e)<br />
at System.Windows.Forms.Button.OnClick(EventArgs e)<br />
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)<br />
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)<br />
at System.Windows.Forms.Control.WndProc(Message& m)<br />
at System.Windows.Forms.ButtonBase.WndProc(Message& m)<br />
at System.Windows.Forms.Button.WndProc(Message& m)<br />
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)<br />
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)<br />
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)<br />
Why is the file in use? Im sure it isnt :P
Regards,
Matjaž
|
|
|
|
|
Perhaps some program has your file open or didn't close properly. I tested my code on multiple times and it works like a charm. Unlocker[^] can help to find out which program is using your file.
|
|
|
|
|
Thanks. Forgot about unlocker. Will try tommorow at work.
Regards,
Matjaž
|
|
|
|