如何从Microsoft.SharePoint.Client.File对象获取文件大小?

时间:2021-03-26 20:25:10

I'm looking for a good way to get filesize from the Microsoft.SharePoint.Client.File object.

我正在寻找一种从Microsoft.SharePoint.Client.File对象获取文件大小的好方法。

The Client object does not have a Length member.

Client对象没有Length成员。

I tried this:

我试过这个:

foreach (SP.File file in files){    string path = file.Path;    path = path.Substring(this.getTeamSiteUrl().Length);    FileInformation fileInformation = SP.File.OpenBinaryDirect(this.Context, path);    using (MemoryStream memoryStream = new MemoryStream())    {        CopyStream(fileInformation.Stream, memoryStream);        file.Size = memoryStream.Length;    }}

Which gave me a length through using the MemoryStream, but it's not good for performance. This file also does not belong to a document library. Since it's an attached file, I can't convert it to a ListItem object using ListItemAllFields. If I could convert it to a ListItem, I could get its size using: ListItem["File_x0020_Size"]

通过使用MemoryStream给了我一个长度,但它对性能不利。此文件也不属于文档库。由于它是附加文件,我无法使用ListItemAllFields将其转换为ListItem对象。如果我可以将它转换为ListItem,我可以使用它来获取它的大小:ListItem [“File_x0020_Size”]

How do I get the filesize of the Client object in SharePoint using C#?

如何使用C#在SharePoint中获取Client对象的文件大小?

3 个解决方案

#1


4  

Load the File_x0020_Size field information to get it.

加载File_x0020_Size字段信息以获取它。

This is what I do when I want to list all the files in a Sharepoint 2010 folder:

当我想列出Sharepoint 2010文件夹中的所有文件时,我就是这样做的:

//folderPath is something like /yoursite/yourlist/yourfolderMicrosoft.SharePoint.Client.Folder spFolder = _ctx.Web.GetFolderByServerRelativeUrl(folderPath);_ctx.Load(spFolder);_ctx.ExecuteQuery();FileCollection fileCol = spFolder.Files;_ctx.Load(fileCol);_ctx.ExecuteQuery();foreach (Microsoft.SharePoint.Client.File spFile in fileCol){    //In here, specify all the fields you want retrieved, including the file size one...    _ctx.Load(spFile, file => file.Author, file => file.TimeLastModified, file=>file.TimeCreated,                             file => file.Name, file => file.ServerRelativeUrl, file => file.ListItemAllFields["File_x0020_Size"]);    _ctx.ExecuteQuery();    int fileSize = int.Parse((string)spFile.ListItemAllFields["File_x0020_Size"]);}

_ctx is obviously the ClientContext you have initiated.

_ctx显然是您启动的ClientContext。

Here's an extended list of all Sharepoint internal fields

这是所有Sharepoint内部字段的扩展列表

#2


0  

Can't you just use the Stream property's length?

你不能只使用Stream属性的长度吗?

file.Size = fileInformation.Stream.Length;

#3


0  

I don't know if this question was ever solved, but for the people who are looking for an answer (like I did) :

我不知道这个问题是否得到解决,但是对于那些正在寻找答案的人(就像我一样):

... CODE FOR GETTING THE SP.FILE ...

...获取SP.FILE的代码......

SP.FileInformation fileInfo = SP.File.OpenBinaryDirect(ctx, mySPFile.ServerRelativeUrl);byte[] bodyString = ReadToEnd(fileInfo.Stream);int length = bodyString.Length;Console.Write(length.ToString());

... DO THE OTHER STUFF YOU NEED TO DO ....

......做你需要做的其他事......

    public static byte[] ReadToEnd(System.IO.Stream stream)    {        long originalPosition = 0;        if (stream.CanSeek)        {            originalPosition = stream.Position;            stream.Position = 0;        }        try        {            byte[] readBuffer = new byte[4096];            int totalBytesRead = 0;            int bytesRead;            while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)            {                totalBytesRead += bytesRead;                if (totalBytesRead == readBuffer.Length)                {                    int nextByte = stream.ReadByte();                    if (nextByte != -1)                    {                        byte[] temp = new byte[readBuffer.Length * 2];                        Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);                        Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);                        readBuffer = temp;                        totalBytesRead++;                    }                }            }            byte[] buffer = readBuffer;            if (readBuffer.Length != totalBytesRead)            {                buffer = new byte[totalBytesRead];                Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);            }            return buffer;        }        finally        {            if (stream.CanSeek)            {                stream.Position = originalPosition;            }        }    }

Hope this will help other people, because I couldn't find a direct answer on the internet!

希望这会有助于其他人,因为我无法在互联网上找到直接答案!

#1


4  

Load the File_x0020_Size field information to get it.

加载File_x0020_Size字段信息以获取它。

This is what I do when I want to list all the files in a Sharepoint 2010 folder:

当我想列出Sharepoint 2010文件夹中的所有文件时,我就是这样做的:

//folderPath is something like /yoursite/yourlist/yourfolderMicrosoft.SharePoint.Client.Folder spFolder = _ctx.Web.GetFolderByServerRelativeUrl(folderPath);_ctx.Load(spFolder);_ctx.ExecuteQuery();FileCollection fileCol = spFolder.Files;_ctx.Load(fileCol);_ctx.ExecuteQuery();foreach (Microsoft.SharePoint.Client.File spFile in fileCol){    //In here, specify all the fields you want retrieved, including the file size one...    _ctx.Load(spFile, file => file.Author, file => file.TimeLastModified, file=>file.TimeCreated,                             file => file.Name, file => file.ServerRelativeUrl, file => file.ListItemAllFields["File_x0020_Size"]);    _ctx.ExecuteQuery();    int fileSize = int.Parse((string)spFile.ListItemAllFields["File_x0020_Size"]);}

_ctx is obviously the ClientContext you have initiated.

_ctx显然是您启动的ClientContext。

Here's an extended list of all Sharepoint internal fields

这是所有Sharepoint内部字段的扩展列表

#2


0  

Can't you just use the Stream property's length?

你不能只使用Stream属性的长度吗?

file.Size = fileInformation.Stream.Length;

#3


0  

I don't know if this question was ever solved, but for the people who are looking for an answer (like I did) :

我不知道这个问题是否得到解决,但是对于那些正在寻找答案的人(就像我一样):

... CODE FOR GETTING THE SP.FILE ...

...获取SP.FILE的代码......

SP.FileInformation fileInfo = SP.File.OpenBinaryDirect(ctx, mySPFile.ServerRelativeUrl);byte[] bodyString = ReadToEnd(fileInfo.Stream);int length = bodyString.Length;Console.Write(length.ToString());

... DO THE OTHER STUFF YOU NEED TO DO ....

......做你需要做的其他事......

    public static byte[] ReadToEnd(System.IO.Stream stream)    {        long originalPosition = 0;        if (stream.CanSeek)        {            originalPosition = stream.Position;            stream.Position = 0;        }        try        {            byte[] readBuffer = new byte[4096];            int totalBytesRead = 0;            int bytesRead;            while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)            {                totalBytesRead += bytesRead;                if (totalBytesRead == readBuffer.Length)                {                    int nextByte = stream.ReadByte();                    if (nextByte != -1)                    {                        byte[] temp = new byte[readBuffer.Length * 2];                        Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);                        Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);                        readBuffer = temp;                        totalBytesRead++;                    }                }            }            byte[] buffer = readBuffer;            if (readBuffer.Length != totalBytesRead)            {                buffer = new byte[totalBytesRead];                Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);            }            return buffer;        }        finally        {            if (stream.CanSeek)            {                stream.Position = originalPosition;            }        }    }

Hope this will help other people, because I couldn't find a direct answer on the internet!

希望这会有助于其他人,因为我无法在互联网上找到直接答案!