0

引数として渡された URL に基づいて、ドキュメント ライブラリに sharepoint フォルダーを作成する関数をまとめました。コードは機能し、フォルダーは webapplication から sharepoint に表示されます。

ただし、後でフォルダーの SPWeb オブジェクトを照会すると、フォルダーが存在しないと表示されます。これは私には意味がありません。さらに奇妙なことに、これとまったく同じコードが少し前まで機能していたということです。私はそれを使用して、共有ポイントでツリー構造を作成していました。

クエリ フォルダーが失敗した場合でも、GetFolder は引き続きフォルダーを返しますが、返されたフォルダーにファイルを追加すると、ファイルが存在しないことを示すランタイム例外が発生します...これは、試行しているフォルダーを意味すると思います追加するファイルがまだ存在しないため、追加先は存在しません。それが私がそれを追加している理由です。

私の質問は、なぜこのエラーが発生するのか、そしてフォルダーが実際に存在するときに FolderExists が false を返すのはなぜですか? GetFolder が実際にそれを返すため、存在することがわかります...

わかりやすくするために、アプリの実際のコードをいくつか含めました。

誰かがコードを見て、何かが飛び出してくるとしたら、それは素晴らしいことです...ありがとう

フォルダを構築するコード:

    public void CreateFolder(SPUriBuilder url)
    {
        try
        {
            Log.Instance.WriteToLog("CreateFolder({0})", url);

            var library = GetLibrary(url.Library);
            if (library != null)
            {                    
                //  parse out string data
                //                    
                var parent = library.RootFolder.ServerRelativeUrl;
                var segments = url.Account.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                var path = parent;

                //  get default folder collection
                //
                SPFolderCollection subFolders = _web.GetFolder(parent).SubFolders;

                //  check for sub-folders to create
                //
                if (segments.Length > 0)
                {
                    int i = 0;
                    do
                    {
                        //  check for folder and create if non-existant
                        //
                        var buildPath = String.Format("{0}/{1}", path, segments[i]);

                        if (_web.GetFolder(buildPath).Exists == false)
                            _web.GetFolder(path).SubFolders.Add(segments[i]);                            

                        //  retrieve new sub-folder collection
                        //
                        subFolders = _web.GetFolder(buildPath).SubFolders;                            
                        path = buildPath;

                        //  next folder in path
                        //
                        i++;
                    }
                    while (i < segments.Length);

                }

                //  finally, add folder of interest
                //
                subFolders.Add(url.Folder);                    

            }
        }
        catch (Exception e)
        {
            throw new SPImportException("Exception: {0}, creating folder: {1} in Library: {2}", e.Message, url.Folder, url.Library);
        }
    }

Query フォルダーへのコード:

    public bool FolderExists(SPUriBuilder url)
    {
        return _web.GetFolder(url.Uri.LocalPath).Exists;
    }

フォルダを取得するコード:

    private SPFolder GetFolder(SPUriBuilder url)
    {
        return _web.GetFolder(url.Uri.LocalPath);
    }

SPUriBuilder は、Uri を組み立てるために作成したカスタム クラスです。

public class SPUriBuilder
{
    public string SiteUrl { get; private set; }        
    public string Library { get; private set; }
    public string Parent { get; private set; }
    public string Folder { get; private set; }
    public string File { get; private set; }
    public string Account { get; private set; }

    public Uri Uri { get; private set; }

    public SPUriBuilder(string siteUrl, string library, string account, string parent, string folder)
    {
        this.SiteUrl = siteUrl;
        this.Library = library;
        this.Account = account;
        this.Parent = parent.Replace("\\", "/");
        this.Parent = this.Parent.StartsWith("/") ? this.Parent.Substring(1) : this.Parent;
        this.Folder = folder;

        StringBuilder url = new StringBuilder();

        url.AppendFormat("{0}/{1}/{2}", SiteUrl, Library, Account);
        if (String.IsNullOrEmpty(Parent) == false)
            url.AppendFormat("/{0}", Parent);
        url.AppendFormat("/{0}", Folder);

        this.Uri = new Uri(url.ToString());

    }

    public SPUriBuilder(SPUriBuilder uri, string file)
        : this(uri.SiteUrl, uri.Library, uri.Account, uri.Parent, uri.Folder)
    {
        this.File = file;

        StringBuilder url = new StringBuilder();

        url.AppendFormat("{0}/{1}", this.Uri.ToString(), this.File);

        this.Uri = new Uri(url.ToString());

    }

    public override string ToString()
    {
        return Uri.ToString();
    }
}
4

1 に答える 1

0

私はこれに対する答えを自分で見つけました。問題は、フォルダの作成に使用されたコードにありました。

      var parent = library.RootFolder.ServerRelativeUrl;

      //  This line of code is incorrect, so it returned the wrong data, thus building the folder path incorrectly.
      //
      var segments = url.Account.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
      var path = parent;


      //   This is the replacement line of code that fixed the issue.
      //
      var segments = url.Uri.LocalPath.Substring(parent.Length+1).Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

    //   as well, this line had to be removed since it was no longer needed
    //
    //  finally, add folder of interest
            //
            subFolders.Add(url.Folder);  

最終的に問題は、ファイルを作成しようとしたフォルダー構造が存在しなかったことです。パス内の1つ以上のセグメントが欠落していました。

So if you ever see this error, make sure you're the folder exists that you are adding the file to. If it isn't, you will certainly experience this error.

于 2011-10-26T03:57:30.847 に答える