Il file di checkout restituito da SharePoint non esiste davvero
-
10-12-2019 - |
Domanda
Ho il seguente codice che mi restituisce un elenco di file di checkout in una libreria documenti.
private static void IdentifyCheckedOutFilesForRequest(SPListItem listItem, SPDocumentLibrary lib, List<InvalidFile> invalidFiles)
{
string libraryName = lib.TitleResource.GetValueForUICulture(Thread.CurrentThread.CurrentUICulture);
SPWeb web = lib.ParentWeb;
// Identify lookupfield in doclib that points to the listitem
string lufName = string.Empty;
foreach (SPField f in lib.Fields)
{
if (f is SPFieldLookup)
{
SPFieldLookup luf = f as SPFieldLookup;
if (new Guid(luf.LookupList) == listItem.ParentList.ID)
{
lufName = luf.InternalName;
break;
}
}
}
if (string.IsNullOrEmpty(lufName))
{
Logger.LogDebug("HelperFunctions", "IdentifyCheckedOutFilesForRequest()", "No lookupfield found in library '" + libraryName + "' pointing to the current item.");
return;
}
// Validate and identify checked out files that were 'once' checked in
SPQuery query = new SPQuery();
query.ViewAttributes = "Scope='Recursive'";
query.Query = string.Format("<Where>" +
"<And>" +
"<BeginsWith><FieldRef Name='ContentTypeId' /><Value Type='ContentTypeId'>0x0101</Value></BeginsWith>" +
"<Eq><FieldRef Name='{0}' LookupId='TRUE' /><Value Type='Lookup'>{1}</Value></Eq>" +
"</and></Where>", lufName, listItem.ID);
SPListItemCollection colItems = lib.GetItems(query);
foreach (SPListItem item in colItems)
{
SPFile currentfile = item.File;
//SPFolder currentFolder = currentfile.ParentFolder;
bool isCheckedOut = currentfile.CheckedOutByUser != null;
string fileName = currentfile.Name;
//string checkedOutUserName = string.Empty;
if (isCheckedOut)
{
InvalidFile invalidFile = new InvalidFile();
invalidFile.LibraryName = libraryName;
invalidFile.FileName = fileName;
invalidFile.IsCheckedOut = isCheckedOut;
invalidFile.CheckedOutUserName = currentfile.CheckedOutByUser.Name;
invalidFile.FileLocation = "/" + SPUtility.GetUrlDirectory(currentfile.ServerRelativeUrl);
invalidFile.FileUrl = currentfile.ServerRelativeUrl;
invalidFiles.Add(invalidFile);
}
}
// Validate and identify checked out files that were 'never' checked in in the library
foreach (SPCheckedOutFile currentfile in lib.CheckedOutFiles)
{
//SPFolder currentFolder = web.GetFolder(string.Concat("", web.Site.WebApplication.GetResponseUri(web.Site.Zone)) + currentfile.DirName);
//string serverRelativeUrlForFile = "/" + currentfile.Url;
InvalidFile invalidFile = new InvalidFile();
invalidFile.LibraryName = libraryName;
invalidFile.FileName = currentfile.LeafName;
invalidFile.IsNeverCheckedIn = true;
invalidFile.IsCheckedOut = true;
invalidFile.CheckedOutUserName = currentfile.CheckedOutByName;
invalidFile.FileLocation = "/" + currentfile.DirName;
invalidFile.FileUrl = currentfile.Url;
invalidFiles.Add(invalidFile);
}
}
.
Questo sta restituendo i file 2 in una libreria di documenti da un subweb, diciamo
Soluzione
Una possibile causa: se un file non è mai stato controllato prima, nessun account può accedervi ad eccezione di quello responsabile per aggiungerlo.Questo di solito accade quando i file vengono caricati senza tutti i campi richiesti compilati (più comunemente questo è il risultato dell'utilizzo della visualizzazione Explorer per rilasciare i file nella libreria).Una soluzione facile è quella di eseguire un programma di check-in ricorsivo per controllare tutti i documenti.Ecco un esempio di uno:
public static void CallMassCheckIn()
{
using (SPSite oSite = new SPSite("http://server/site"))
{
using (SPWeb oWeb = oSite.OpenWeb())
{
SPDocumentLibrary oLib = (SPDocumentLibrary)oWeb.Lists["Library Name"];
int iFolderCount = oLib.Folders.Count;
// Root folder check-in
MassCheckIn(oLib.RootFolder);
// Sub-folder check-in
for (int i = 0; i < iFolderCount; i++)
{
MassCheckIn(oLib.Folders[i].Folder);
}
}
}
}
public static void MassCheckIn(SPFolder oFolder)
{
foreach (SPFile oFile in oFolder.Files)
{
if (oFile.CheckOutType != SPFile.SPCheckOutType.None)
{
oFile.CheckIn("Programmatically checked in");
}
}
}
.
Quel particolare è preso a calci da notte da un compito di Windows su uno dei miei server.Gli utenti di quel sito fanno principalmente tutte le loro transazioni con Windows Explorer, e tendono a dimenticare di controllare i documenti dopo che vengono aggiunti in questo modo, quindi questa è una soluzione semplice.
Spero che ti aiuti!