2016-10-17 4 views
1

数百のPDFファイルをSharePoint 2013ライブラリに転送するCSOMプログラムがあります。一度、転送されたファイルの1つが破損し、開くことができません。ソースファイルは良好で、他のライブラリに転送された後も同じファイルを開くことができますが、ランダムなライブラリでは破損します。 ライブラリをループして、壊れたファイルを見つけて削除したいのですが、ファイルが破損している場合はどうすればCSOMを使用して知ることができますか?私はループして、File.OpenBinaryStream()を使用してみましたが、破損したファイルで成功します。以下は、ライブラリを読み込んでファイルをループするコードです。任意の提案をいただければ幸いです。CSOMを使用してSharePoint 2013 ListItemCollectionで壊れたファイルを見つける方法

    using (ClientContext destContext = new ClientContext(clientSite.Value)) 
       { 
        destContext.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication; 
        destContext.FormsAuthenticationLoginInfo = new FormsAuthenticationLoginInfo(ClientSiteUsername, ClientSitePassword); 

        // get the new list 
        Web destWeb = destContext.Web; 
        ListCollection lists = destWeb.Lists; 
        List selectedList = lists.GetByTitle(clientLibraryName); 
        destContext.Load(lists); 
        destContext.Load(selectedList); 
        ListItemCollection clientCurrentItemsList = selectedList.GetItems(CamlQuery.CreateAllItemsQuery()); 

        destContext.Load(clientCurrentItemsList, 
             eachItem => eachItem.Include(
             item => item, 
             item => item["ID"], 
             item => item["FileLeafRef"])); 

        try 
        { 
         destContext.ExecuteQuery(); 
        } 
        catch (Exception ex) 
        { 
         log.Warn(String.Format("Error in VerifyClientDocuments. Could not read client library: {0}", clientSite.Value), ex); 
         continue; 
        } 

        foreach (ListItem item in clientCurrentItemsList) 
        { 
         try 
         { 
          item.File.OpenBinaryStream(); 
         } 
         catch (Exception ex) 
         { 
          var val = ex.Message; 
          //delete here 
         } 

        } 
       } 

答えて

0

期待されたファイルサイズと新しいファイルのサイズを確認していました。破損したファイルは実際には0バイトのサイズを報告するので、それらを削除してから後で再追加します。

       for (var counter = clientCurrentItemsList.Count; counter > 0; counter--) 
           { 

           var clientFileSize = clientCurrentItemsList[counter - 1].FieldValues. 
            Where(x => x.Key == "File_x0020_Size").FirstOrDefault().Value.ToString(); 
           var fileName = clientCurrentItemsList[counter - 1].FieldValues. 
            Where(x => x.Key == "FileLeafRef").FirstOrDefault().Value.ToString(); 
           var serverFileSize = approvedDocumentList.Where(x => x.FieldValues["FileLeafRef"].ToString() == 
            fileName).FirstOrDefault().FieldValues["File_x0020_Size"].ToString(); 

           if (clientFileSize != serverFileSize) 
           { 
            clientCurrentItemsList[counter - 1].DeleteObject(); 
            destContext.ExecuteQuery(); 
            log.Info(String.Format("File [{0}] deleted from {1} File type {2} - Reason: Client file was corrupt", 
             fileName, clientSiteURL, documentType.ToString())); 
           } 
          } 
関連する問題