【问题标题】:Folder inside the right folder, C#右侧文件夹中的文件夹,C#
【发布时间】:2014-02-10 17:25:37
【问题描述】:

当我的程序运行时,我希望它在正确的国家文件夹中创建一个文件夹。如果错误来自国家 1,则应将其放入该文件夹。现在它只在同一路径中创建新文件夹,而不是在“Country1”路径中。

  • 示例:
  • 现在情况如何:C:\Country1 失败 2014-1-21
  • 应该如何:C:\Country1\Country1 失败 2014-1-21

我做错了什么?

    #region Failure Folder Creation
        string failureDir = string.Empty;
        failureDir = AppDomain.CurrentDomain.BaseDirectory + "Source\\";
        try
        {

            string failureDirToday = string.Empty;
            if (metaDataXmlPath.Contains("Country1"))
                failureDir = failureDir + "\\Country1 Failure";
            else if (metaDataXmlPath.Contains("Country2"))
                failureDir = "\\Country2 Failure";
            else if (metaDataXmlPath.Contains("Country3"))
                failureDir = "\\Country3 Failure";
            failureDirToday = failureDir + " " + todayMoveDate;

            if (!Directory.Exists(failureDir))
                Directory.CreateDirectory(failureDir);

            if (!Directory.Exists(failureDirToday))
                Directory.CreateDirectory(failureDirToday);
        }

【问题讨论】:

  • 您可以在对文件进行任何操作之前记录/调试failureDir 变量吗?如果不符合您的预期,请找出问题所在
  • 最佳实践是使用System.IO.Path.Combine(failureDir, "Country1 Failure") 而不是failureDir + "\\Country1 Failure";
  • 这只是在主结构中添加了一个 2014-1-21 文件夹

标签: c# visual-studio-2010 directory


【解决方案1】:

我没有看到您创建 Country1 子文件夹。

我只是改变

if (metaDataXmlPath.Contains("Country1"))
    failureDir = failureDir + "\\Country1 Failure";

进入

if (metaDataXmlPath.Contains("Country1"))
    failureDir = failureDir + "Country1\\Country1 Failure";

(这只是最简单的解决方案。使用路径时,我会坚持使用静态path.combine()-方法而不是字符串连接。)


让我们检查一下你的代码,看看会发生什么:

failureDir = AppDomain.CurrentDomain.BaseDirectory + "Source\\";

failureDir 现在是 C:\Source

我们假设代码运行到第一个 if 分支:

failureDir = failureDir + "\\Country1 Failure";

failureDir 现在是C:\Source\Country1 Failure

在所有的 if-else 之后,还有一个最终声明:

failureDirToday = failureDir + " " + todayMoveDate;

所以failureDirTodayC:\Source\Country1 Failure 2014-1-21。这与您得到的结果相同,正如我在开头所说的那样:您根本不创建任何名为 Country1 的子文件夹。

【讨论】:

  • 感谢您对我在编码中头晕的帮助和解释。它越来越接近,但现在它正在添加两个文件夹:Country1 Failure 和 Country1 Failure 2014-1-21 到主要的 Country 1 failure 文件夹中......哈哈。我只需要最后一个,然后一切都很好:)
  • @Lebowski 然后你必须删除Directory.CreateDirectory(failureDir);,因为这是创建到没有日期的文件夹。
【解决方案2】:
  1. 不确定您要通过调用 AppDomain.CurrentDomain.BaseDirectory 实现什么。这将返回运行应用程序的文件夹,而不是 C: 或任何其他根文件夹。 我也不明白你为什么将 Source 文件夹附加到它,但也许这是你想做的一部分。

  2. 您应该使用 Path.Combine 来连接文件夹名称并创建层次结构。 在您的示例中,您正在创建 2 个不同的文件夹,一个有日期,一个没有日期。 相反,您应该做的是

    if(metaDataXmlPath.Contains("Country1"))
    {
         string errorSourceName = "Country1";
         failureDir = Path.Combine(Path.Combine(failureDir, errorSourceName), String.Format("{0} {1}", errorSourceName, todayMoveDate));
    }
    

    现在您可以创建failureDir only,这将创建整个层次结构。

    我正在添加一个代码示例,说明您的代码在更改后的外观

    string failureDir = string.Empty;
    failureDir = AppDomain.CurrentDomain.BaseDirectory + "Source\\";
    try
    {
    
        string failureDirToday = string.Empty;
        if(metaDataXmlPath.Contains("Country1"))
        {
             string errorSourceName = "Country1";
             failureDir = Path.Combine(Path.Combine(failureDir, errorSourceName), String.Format("{0} {1}", errorSourceName, todayMoveDate));
        }
        else if (metaDataXmlPath.Contains("Country2"))
        {
             string errorSourceName = "Country2";
             failureDir = Path.Combine(Path.Combine(failureDir, errorSourceName), String.Format("{0} {1}", errorSourceName, todayMoveDate));
        }
        else if (metaDataXmlPath.Contains("Country3"))
        {
             string errorSourceName = "Country3";
             failureDir = Path.Combine(Path.Combine(failureDir, errorSourceName), String.Format("{0} {1}", errorSourceName, todayMoveDate));
        }
        // Notice the eliminated line here
    
        // This is where we actually create the folder
        if (!Directory.Exists(failureDir))
            Directory.CreateDirectory(failureDir);
    
        // Notice the eliminated line here
    }
    

【讨论】:

  • 这段代码在 Country1 中创建了两个子文件夹。丹麦失败 2014-1-21 和丹麦失败 2014-1-21 2014-1-21
  • 请看我的编辑。并在运行代码之前从 Source 目录中删除文件夹。
  • 现在完美解决了,只剩下一个问题:如果我明天运行它,它会将 Cuntry1 Failure 2014-1-22 添加到 Country1 文件夹中吗?
  • 在您的示例中,您没有展示如何将日期值提取到 todayMoveDate 变量。正确的方法是调用 DateTime.Today 并将其格式化为您想要的日期格式。如果您有正确的日期,那么是的,它会将其添加到正确的文件夹下。如果您觉得我的回答有帮助,请投票,谢谢
  • 我的朋友,我希望我能投票赞成你的款待,但我还需要 5 分。但我会尽快做。谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多