4

Я пытаюсь загрузить txt-файл из подпапки внутри папки в библиотеке документов.Клиентская объектная модель Sharepoint 2010 с camlQuery - загрузка файла, но без содержимого/0 байт

Я использую camlQuery для достижения этого. К сожалению, я не получаю содержимое файла txt. Он имеет 0 байт.

public void SaveFolderFiles(string fileName, string libraryName, ClientOM.ClientContext clientContext) 
    { 
     ClientOM.List sharedDocumentsList = clientContext.Web.Lists.GetByTitle(libraryName); 
     ClientOM.CamlQuery camlQuery = new ClientOM.CamlQuery(); 
     camlQuery.FolderServerRelativeUrl = "/Site/Folder/Folder2010/"; 
     camlQuery.ViewXml = 
      @"<View> 
      <Query> 
       <Where> 
       <Eq> 
        <FieldRef Name='FileLeafRef'/> 
        <Value Type='Text'>" + fileName + @"</Value> 
       </Eq> 
       </Where> 
       <RowLimit>1</RowLimit> 
      </Query> 
      </View>"; 
     ClientOM.ListItemCollection listItems = sharedDocumentsList.GetItems(camlQuery); 
     clientContext.Load(sharedDocumentsList); 
     clientContext.Load(listItems); 
     clientContext.ExecuteQuery(); 
     if (listItems.Count == 1) 
     { 
      ClientOM.ListItem item = listItems[0]; 
      Console.WriteLine("FileLeafRef: {0}", item["FileLeafRef"]); 
      Console.WriteLine("FileDirRef: {0}", item["FileDirRef"]); 
      Console.WriteLine("FileRef: {0}", item["FileRef"]); 
      Console.WriteLine("File Type: {0}", item["File_x0020_Type"]); 
      ClientOM.FileInformation fileInformation = ClientOM.File.OpenBinaryDirect(clientContext, (string)item["FileRef"]); 
      using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       fileInformation.Stream.CopyTo(memoryStream); 
       using (FileStream fileStream = File.Create(@"D:\" + item["FileLeafRef"].ToString())) 
       { 
        memoryStream.CopyTo(fileStream); 
       } 
       memoryStream.Flush(); 
      } 


     } 
     else 
     { 
      Console.WriteLine("Document not found."); 
     } 
    } 

Возможно, у кого-то есть идея?

С уважением

ответ

8

Попробуйте это:

использованием FileInformation и получить MemoryStream

string fileurl = (string)liitem["FileRef"]; 
FileInformation ffl = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, fileurl); 
byte[] bytesarr = ReadFully(ffl.Stream); 
MemoryStream mnm = new MemoryStream(bytesarr); 

функция ReadFully которая преобразует Stream в Bytes array

public byte[] ReadFully(Stream input) 
    { 
     byte[] buffer = new byte[16 * 1024]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      return ms.ToArray(); 
     } 
    } 
0

Экспортируйте прямо в выходной файл ... Я думаю, что это самый простой и простой способ сделать это.

FileInformation fInfo = File.OpenBinaryDirect(currentSiteContext, ServerRelativeURL); 
System.IO.FileStream outPutFile = System.IO.File.OpenWrite(string.Concat(OutputPath, "\\", DocumentName)); 
fInfo.Stream.CopyTo(outPutFile); 
fInfo.Stream.Close(); 
outPutFile.Close(); 
Смежные вопросы