Ramesh.kbvr
Ramesh.kbvr

Reputation: 783

Saving SPFile to local hard disk

I am trying to retrieve the file from sharepoint to local hard disk.

Here is my code:

SPFile file = web.GetFile("http://localhost/Basics.pptx");                
byte[] data = file.OpenBinary();
FileStream fs = new FileStream(@"C:\Users\krg\Desktop\xyz.pptx",FileMode.Create,FileAccess.Write);

BinaryWriter w = new BinaryWriter(fs);            
w.Write(data, 0, (int)file.Length);            
w.Close();            
fs.Close();

When I am trying to open that file, it is showing as a corrupted file.

The original file size is 186kb, after download the file size is 191kb.

What is the solution to download the file from sharepoint..?

Upvotes: 5

Views: 14697

Answers (2)

Stefan
Stefan

Reputation: 14880

You do not need the BinaryWriter:

int size = 10 * 1024;
using (Stream stream = file.OpenBinaryStream())
{
  using (FileStream fs = new FileStream(@"C:\Users\krg\Desktop\xyz.pptx", FileMode.Create, FileAccess.Write))
  {
    byte[] buffer = new byte[size];
    int bytesRead;
    while((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
      fs.Write(buffer, 0, bytesRead);
    }
  }
}

Upvotes: 5

tgauthier
tgauthier

Reputation: 141

Just a little contribution to this answer. It's better to check the number of bytes read in each bloc so that the stream written will be the exact replicat of the stream read from SharePoint. See correction below.

int size = 10 * 1024;
using (Stream stream = file.OpenBinaryStream())
{  
 using (FileStream fs = new FileStream(@"C:\Users\krg\Desktop\xyz.pptx", FileMode.Create, FileAccess.Write))
 {
   byte[] buffer = new byte[size];
   int nbBytesRead =0;
   while((nbBytesRead=stream.Read(buffer, 0, buffer.Length)) > 0) 
   {
      fs.Write(buffer, 0, nBytesRead);
   }
 }
}

Upvotes: 14

Related Questions