【问题标题】:How to validate if a folder already exists如何验证文件夹是否已存在
【发布时间】:2019-01-01 13:02:52
【问题描述】:

我想创建文件夹并在文件夹中添加类。我可以创建一次文件夹,但是一旦创建了它,我只想添加类。我的代码给出了错误,因为我试图多次创建一个文件夹,这是不对的。所以在向文件夹添加类之前,我想检查文件夹是否已经存在,如果存在我只想添加类。

 ProjectItem rootFolder = project.ProjectItems.AddFolder(folder);                    
 ProjectItem item = rootFolder.ProjectItems.AddFromTemplate(itemPath, className);

【问题讨论】:

  • 文件夹也是ProjectItemthe documentation say 是什么?据我所知,没有Exists 方法,但您可以枚举(实际上:遍历)项目并测试每个项目是否与您的文件夹相等。
  • 是的,folder 是一个字符串。我有一个for each,为每个班级创建一个文件夹。但是如果我有两个属于同一个文件夹的类会给我错误,因为我没有做这个验证。这就是我要找的。​​span>
  • 基于现有答案下方的评论讨论,为澄清起见,ProjectItems.AddFolder 创建了一个解决方案文件夹。这是您想要的还是您在谈论磁盘上的正常“物理”目录结构?
  • 创建解决方案文件夹

标签: c# validation file-exists


【解决方案1】:

根据documentation,没有一种Exists 函数可以告诉我们文件夹是否已经存在。

所以你至少有两个选择:

1.尝试忽略

简单地说:

try 
{
    var rootFolder = project.ProjectItems.AddFolder(folder);
}
catch 
{
    /* folder already exists, nothing to do */
}

2。解决方案文件夹只能出现在解决方案根节点下方的第一级,因此我们可以使用非递归解决方案。

public static bool CheckIfSolutionFolderExists(ProjectItems projectItems, string foldername)
{
    foreach(var projectItem in projectItems)
    {
        if(projectItem.Kind == EnvDTE.vsProjectItemKindVirtualFolder)
        {
            if(projectItem.Name == foldername)
            {
                return true;
            }
        }
    }
    return false;
}

对于递归解决方案,我找到了this,归结为:

public static bool CheckIfFileExistsInProject(ProjectItems projectItems, string fullpath)
{
    foreach(ProjectItem projectItem in projectItems)
    {
        if(projectItem.Name == fullpath)
        {
            return true; 
        }
        else if ((projectItem.ProjectItems != null) && (projectItem.ProjectItems.Count > 0))
        {
            /* recursive search */
            return CheckIfFileExistsInProject(projectItem.ProjectItems, fullpath);
        }
    } 
    return false;
}

当您想在项目树中镜像文件系统层次结构时,解决方案和项目文件夹管理的稳健模式将使用 AddFromDirectory,而 AddFolder 仅用于在文件系统中没有表示的虚拟文件夹。

ProjectItem item;
if(Directory.Exists(itemname))
{
    item = project.AddFromDirectory(itemname);
}
else
{
    item = project.AddFolder(itemname);
}

(来源:灵感来自this

【讨论】:

    【解决方案2】:

    您需要执行以下操作:

    if(Directory.Exists(path)) 
    {
        // The folder already exists
    }
    else 
    {
        //Create a new folder here ...
    } 
    

    更多详情请查看Directory.Exists

    【讨论】:

    • 这与问题有什么关系? OP 希望阻止将文件夹添加到先前已添加的解决方案树中。
    • 此代码示例主要用于检查文件夹是否存在,这不是OP面临的问题吗?如果文件夹已经存在,则继续向其中添加项目,否则创建一个新的。
    • 我认为不是,因为ProjectItem.AddFolder 不像ProjectItem.AddFromDirectory 不采用物理路径 - 它只是解决方案资源管理器中文件夹节点的名称。这种文件夹作为Project 条目存在于sln 文件中,但不对应于磁盘上的目录。
    【解决方案3】:

    您可以使用方法Directory.Exists

    在你的代码中它看起来像那里

    if(!Directory.Exists(folder)) { 
      ProjectItem rootFolder = project.ProjectItems.AddFolder(folder);
    }
    ProjectItem item = rootFolder.ProjectItems.AddFromTemplate(itemPath, className);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2014-02-01
      • 2020-12-26
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多