2013-09-27 41 views
1

我目前正在使用Windows服務,該服務可以移動某些位置的文件並使其與SharePoint文檔庫保持同步。將文件流式傳輸到外部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路由。

回答

1

上傳/同步/ etc功能表現良好,但我遇到文件屬性問題。上傳時(下面的代碼示例)文件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(); 
} 
+0

感謝您的答覆。這證實了我對時間戳的想法。我也注意到,自從我發佈了Sharepoint將信息列爲新的問題,即使您直接複製它,因爲它基於數據庫信息。我查看了File.SetLastWriteTime,但似乎SharePoint不喜歡我觸摸事物。 (編輯我的問題以獲取附加信息) – sealz

+0

您可以手動循環Sharepoint上的文件並設置屬性。我會更新我的帖子以反映這一點。 –

+0

謝謝。循環播放SP文件的問題是我無法進行身份驗證,因爲我正在外部同步文件。除非有一種我忽略的方式,否則我似乎無法使用SP調用進行身份驗證。 – sealz