【问题标题】:Last Modified Property When Streaming a File to an External SharePoint将文件流式传输到外部 SharePoint 时的上次修改属性
【发布时间】:2013-09-27 19:11:40
【问题描述】:

我目前正在使用一种 Windows 服务,该服务可以从特定位置移动文件并使其与 SharePoint 文档库保持同步。

上传/同步/等功能运行良好,但我遇到了文件属性问题。上传时(下面的代码示例)文件 LastModified 属性设置为文件上传的时间。如果我直接将文件复制/粘贴到目录中,情况并非如此。

我已经研究过在上传后更改属性的可能性,但这并不理想。从测试来看,这似乎是由于流被“构建”为另一端的新文件造成的?有没有办法随文件一起发送文件属性?

public static string UploadFile(string destUrl, string sourcePath, CredentialCache cc)
{
    try
    {
        Uri destUri = new Uri(destUrl);
        FileStream inStream = File.OpenRead(sourcePath);
        WebRequest req = WebRequest.Create(destUri);
        req.Method = "PUT";
        req.Headers.Add("Overwrite", "F");
        req.Timeout = System.Threading.Timeout.Infinite;
        req.Credentials = cc;
        Stream outStream = req.GetRequestStream();
        byte[] buffer = new byte[32768];
        int read;
        while ((read = inStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            outStream.Write(buffer, 0, read);
        }
        outStream.Flush();
        outStream.Close();
        inStream.Flush();
        inStream.Close();
        WebResponse ores = req.GetResponse();
        ores.Close();
        return "success";          
    } //End Try for Try/Catch of UploadFile()
    catch (Exception ex)
    {
        return ex.Message;
    } //End Try/Catch for UploadFile()
} //End UploadFile()

编辑 - 附加信息

总结一下我在下面的答案中留下的评论:

自从我发布了 Sharepoint 将信息列为新信息的问题后,我也注意到了,即使您直接复制它也是如此,因为它是基于数据库信息的(我相信?)。我已经查看了File.SetLastWriteTime,但似乎 SharePoint 不喜欢我触摸东西。

我也尝试使用 SharePoint 调用设置特征和上传文件,但由于我发布到外部 SharePoint 实例,除非我走 WebRequest 路由,否则我无法进行身份验证。

【问题讨论】:

    标签: c# http sharepoint webrequest webresponse


    【解决方案1】:

    上传/同步/等功能运行良好,但我遇到了文件属性问题。上传时(下面的代码示例)文件 LastModified 属性设置为文件上传的时间。如果我直接将文件复制/粘贴到目录中,情况并非如此。

    这是有道理的。试试这个,打开一个新的 Windows 资源管理器实例,选择一个文件,复制它,粘贴它。新文件上的创建和访问日期将是今天的日期和时间,但修改后的日期将与原始日期一致。

    当您上传文件时,您正在创建一个没有元数据的全新副本,因此修改和创建的日期将与今天的日期和时间匹配。

    一旦文件在服务器上并且您可以获得它的句柄,您可以做的是使用File.SetLastWriteTime 手动设置属性。 (见SetLastWriteTime documentation)。

    希望对您有所帮助。

    编辑 1:您可以通过以下方式遍历 Sharepoint 上的文件集合并设置新文件的属性:

    var list = web.Lists[new Guid("...")];
    var folderItem = list.RootFolder.SubFolders;
    
    foreach (File f in files) {
        var lastModifiedBy = context.Web.EnsureUser(f.LastModifiedBy);
        var lastModified = f.LastModified;
        SPFile uploadedFile = folderItem.Files.Add(f.FileName, f.Content, lastModifiedBy,
                              lastModifiedBy, lastModified, lastModified);
        uploadedFile.Item["Created"] = lastModified;
        uploadedFile.Item["Modified"] = lastModified;
        uploadedFile.Item.UpdateOverwriteVersion();
    }
    

    【讨论】:

    • 感谢您的回复。这验证了我对时间戳的想法。我也注意到了,因为我发布了 Sharepoint 将信息列为新信息的问题,即使您直接复制它也是如此,因为它是基于数据库信息的。我已经查看了 File.SetLastWriteTime,但似乎 SharePoint 不喜欢我触摸东西。 (编辑我的问题以包含更多信息)
    • 您可以手动遍历 Sharepoint 上的文件并设置属性。我会更新我的帖子以反映这一点。
    • 谢谢。循环管理 SP 文件的问题是我无法进行身份验证,因为我正在外部同步文件。除非有我忽略的方法,否则我似乎无法使用 SP 调用进行身份验证。
    • 喂!也许是时候升级了? :P 所以是的,你被WebRequestNetworkCredentials 卡住了。尝试提出新请求并为身份验证执行request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;,看看是否适合您。
    • 看起来你在我发布之前回答了我的最后一个问题。感谢您的讨论。
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2017-07-23
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多