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

http://www.mydomian.com/spweb/doclibrary/file1.docx

Quando copio e incolla questo nel browser il file non esiste.Dovrebbe essere il checkout da parte di qualcuno, ma perché come amministratore di sitecollection non riesco a vederlo nel browser, ma l'API lo restituisce?

Non riesco a vedere nemmeno nelle viste, ho creato una vista di tutti i file di checkout, ma non c'è. Ho controllato e ignoravo i checkoutFiles e l'API mi restituisce ancora quei 2 file.

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top