Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Sharepoint中的嵌套文件夹下创建文件_C#_Sharepoint - Fatal编程技术网

C# 在Sharepoint中的嵌套文件夹下创建文件

C# 在Sharepoint中的嵌套文件夹下创建文件,c#,sharepoint,C#,Sharepoint,在Sharepoint中的嵌套文件夹下创建文件的最佳方法是什么? 我目前的方法 public string CreateSPFile(string spServerURL, string spDocumentLibraryURL, string folder, string fileName, Stream fileStream, bool overwrite) { if (SPSite.Exists(new Uri(spServerURL))) { SPSite

在Sharepoint中的嵌套文件夹下创建文件的最佳方法是什么? 我目前的方法

public string CreateSPFile(string spServerURL, string spDocumentLibraryURL, string folder, string fileName, Stream fileStream, bool overwrite)
{
    if (SPSite.Exists(new Uri(spServerURL)))
    {
        SPSite site = new SPSite(spServerURL);
        SPWeb oWebsite = site.OpenWeb();
        oWebsite.AllowUnsafeUpdates = true;
        SPFolder spFolder = oWebsite.Folders[spDocumentLibraryURL];
        if (!string.IsNullOrEmpty(folder))
        {
            spFolder.SubFolders[folder].Files.Add(fileName, fileStream, overwrite);
        }
        else
        {
            SPFileCollection files = spFolder.Files;
            spFolder.Files.Add(fileName, fileStream, overwrite);
        }
        oWebsite.AllowUnsafeUpdates = false;
        site.Close();
    }
}
如你们所见,若我想在嵌套文件夹下创建一个文件,我需要修改我的代码。 处理这种保存嵌套文件夹情况的更好方法是什么


根据我的项目结构,文件可能类似于/DocumentLibrary/Folder1/Folder2/Folder3/file.txt。

您可以通过其服务器相对URL加载文件夹:

SPFolder folder = web.GetFolder("/DocumentLibrary/Folder1/Folder2/Folder3/");
使用这种方法,您不必逐个文件夹加载,您的代码可以使用n个文件夹级别

我已更新了您的代码示例,并添加了一些有关SharePoint最佳实践的评论:

public string CreateSPFile(string spServerURL, string spDocumenttargetUrl, string folder, string fileName, Stream fileStream, bool overwrite)
{
    // I suggest skip this pre check since it internally opens a new site object
    // If you have to silenlty ignore non-existant SPSite you should catch a FileNotFoundException.
    if (SPSite.Exists(new Uri(spServerURL)))
    {
        // use the using construct to safely dispose the opened SPSite object
        using (SPSite site = new SPSite(spServerURL))
        {
            // SPWeb object opened with SPSite.OpenWeb() have to be disposed as well
            using (SPWeb web = site.OpenWeb())
            {
                web.AllowUnsafeUpdates = true;

                string targetUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, spDocumenttargetUrl);

                if (!String.IsNullOrEmpty(folder))
                {
                    targetUrl = SPUrlUtility.CombineUrl(targetUrl, folder);
                }

                SPFolder target = web.GetFolder(target);

                SPFileCollection files = target.Files;
                target.Files.Add(fileName, fileStream, overwrite);

                // no need to revert AllowUnsafeUpdates for newly opened webs
                // web.AllowUnsafeUpdates = false;
            }
        }
    }
}

您可以通过文件夹的服务器相对URL加载文件夹:

SPFolder folder = web.GetFolder("/DocumentLibrary/Folder1/Folder2/Folder3/");
使用这种方法,您不必逐个文件夹加载,您的代码可以使用n个文件夹级别

我已更新了您的代码示例,并添加了一些有关SharePoint最佳实践的评论:

public string CreateSPFile(string spServerURL, string spDocumenttargetUrl, string folder, string fileName, Stream fileStream, bool overwrite)
{
    // I suggest skip this pre check since it internally opens a new site object
    // If you have to silenlty ignore non-existant SPSite you should catch a FileNotFoundException.
    if (SPSite.Exists(new Uri(spServerURL)))
    {
        // use the using construct to safely dispose the opened SPSite object
        using (SPSite site = new SPSite(spServerURL))
        {
            // SPWeb object opened with SPSite.OpenWeb() have to be disposed as well
            using (SPWeb web = site.OpenWeb())
            {
                web.AllowUnsafeUpdates = true;

                string targetUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, spDocumenttargetUrl);

                if (!String.IsNullOrEmpty(folder))
                {
                    targetUrl = SPUrlUtility.CombineUrl(targetUrl, folder);
                }

                SPFolder target = web.GetFolder(target);

                SPFileCollection files = target.Files;
                target.Files.Add(fileName, fileStream, overwrite);

                // no need to revert AllowUnsafeUpdates for newly opened webs
                // web.AllowUnsafeUpdates = false;
            }
        }
    }
}

< >将文件上传到嵌套文件夹中,可以考虑以下方法:

  • 使用下面提供的方法确保目标文件夹存在
  • 使用上载文件
如何使用SharePoint SSOM确保嵌套文件夹存在 例如:

var targetFolder = web.EnsureFolder("Documents", "Orders3/A/A1");
var fileContent = System.IO.File.ReadAllBytes(fileName);
var fileUrl = Path.GetFileName(fileName);
targetFolder.Files.Add(fileUrl, fileContent);

< >将文件上传到嵌套文件夹中,可以考虑以下方法:

  • 使用下面提供的方法确保目标文件夹存在
  • 使用上载文件
如何使用SharePoint SSOM确保嵌套文件夹存在 例如:

var targetFolder = web.EnsureFolder("Documents", "Orders3/A/A1");
var fileContent = System.IO.File.ReadAllBytes(fileName);
var fileUrl = Path.GetFileName(fileName);
targetFolder.Files.Add(fileUrl, fileContent);

提示:如果if-else以“!”开头,则应始终删除“!”(当然,为了可读性,请交换if和else的内容:)谢谢。是的,这对其他人来说会更好。@radbyx:我不建议将此作为一般规则。这真的取决于上下文。@Stefan我以前读过,但现在找不到了。我不是说我是对的,只是因为我读了它。如果If中的“!”除了更难的可读性之外,没有任何其他内容,那么我认为您应该翻转If-else。我不在乎人们会怎么做,但如果有人以前从未想过这一点,这可能是有用的。@radbyx我不同意。也就是说,我编写的代码使“肯定的情况”是向前的(很少有例外)。在这种情况下,“正数”表示字符串不为null或空。(实际上是双重否定)提示:如果if-else以“!”开头,则应始终删除“!”(当然,为了可读性,请交换if和else的内容:)谢谢。是的,这对其他人来说会更好。@radbyx:我不建议将此作为一般规则。这真的取决于上下文。@Stefan我以前读过,但现在找不到了。我不是说我是对的,只是因为我读了它。如果If中的“!”除了更难的可读性之外,没有任何其他内容,那么我认为您应该翻转If-else。我不在乎人们会怎么做,但如果有人以前从未想过这一点,这可能是有用的。@radbyx我不同意。也就是说,我编写的代码使“肯定的情况”是向前的(很少有例外)。在这种情况下,“正数”表示字符串不为null或空。(实际上是双重否定。)Stefan>>非常感谢你的回答。但我有一些问题。你什么意思
//我建议跳过这个预检查,因为它会在内部打开一个新的站点对象//如果你不得不愚蠢地忽略不存在的SPSite,你应该捕获一个FileNotFoundException?我对SharePoint了解不多。我什么时候需要恢复AllowUnsafeUpdate?再次感谢。@kevin:
SPSite.Exists()
在内部打开一个新的SPSite对象。调用构造函数
newspsite(…)
查询数据库。如果性能与您相关,您可能希望避免
SPSite.Exists()
带来的开销,并捕获异常。关于
AllowUnsafeUpdates
对于您无法控制的对象,最好将其还原-您没有打开自己。例如:
SPContext.Current.Web
Stefan>>非常感谢您的精彩回答。但我有一些问题。你什么意思
//我建议跳过这个预检查,因为它会在内部打开一个新的站点对象//如果你不得不愚蠢地忽略不存在的SPSite,你应该捕获一个FileNotFoundException?我对SharePoint了解不多。我什么时候需要恢复AllowUnsafeUpdate?再次感谢。@kevin:
SPSite.Exists()
在内部打开一个新的SPSite对象。调用构造函数
newspsite(…)
查询数据库。如果性能与您相关,您可能希望避免
SPSite.Exists()
带来的开销,并捕获异常。关于
AllowUnsafeUpdates
对于您无法控制的对象,最好将其还原-您没有打开自己。例如:
SPContext.Current.Web