我目前正在使用一种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
路线,否则无法进行身份验证。
上传/同步/等功能运行良好,但我在文件属性方面遇到了问题。上载时(下面的代码示例(,文件 LastModified 属性设置为上载文件的时间。如果我直接将文件复制/粘贴到目录中,则情况并非如此。
这是有道理的。试试这个,打开Windows资源管理器的新实例,选择一个文件,复制它,粘贴它。新文件上的创建和访问日期将是今天的日期和时间,但修改后的日期将与原始日期匹配。
当您上传文件时,您正在创建一个没有元数据的全新副本,因此修改和创建的日期将与今天的日期和时间匹配。
一旦文件在服务器上并且可以获取它的句柄,您可以做的是使用 File.SetLastWriteTime
手动设置属性。(请参阅 SetLastWriteTime 文档(。
希望有帮助。
编辑 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();
}