如何确保如果我关闭程序并再次运行它将在新目录中创建新文件?

时间:2014-10-24 15:53:54

标签: c# .net winforms

我有这个方法:

private void CreateAnimatedGif(bool ToCreate)
{
    string combined = null;
    DirectoryInfo di = new DirectoryInfo(sf);
    FileInfo[] fi = di.GetFiles("*.gif");
    if (simtest == fi.Length - 1)
    {
        simtest = 0;
    }

    if (AnimatedGifFiles.Count == 0)
        startTime = DateTime.Now;

    if (ToCreate == false)
    {
        combined = Path.Combine(sf, fi[simtest].FullName);
        AnimatedGifFiles.Add(combined);//last_file);
        simtest += 1;
    }
    else
    {
        if (AnimatedGifFiles.Count > 1)
        {
            rainEventCounter += 1;
            AnimatedGifDirectoryEvent = "Rain event " + rainEventCounter.ToString();
            string eventDir = Path.Combine(AnimatedGifDirectory, AnimatedGifDirectoryEvent);

            if (!Directory.Exists(eventDir))
            {
                Directory.CreateDirectory(eventDir);
            }

            string outputFile = System.IO.Path.Combine(
                eventDir,
                string.Format(
                    System.Globalization.CultureInfo.InvariantCulture,
                    "Event-{0:yyyy-MM-dd-HHmmss}_{1:yyyy-MM-dd-HHmmss}.gif", startTime, DateTime.Now
                )
            );

            unfreezWrapper1.MakeGIF(AnimatedGifFiles, outputFile, 80, true);
        }

        AnimatedGifFiles.Clear();
    }
}

在这部分中,我每次都在outputFile内创建目录。

rainEventCounter += 1;
AnimatedGifDirectoryEvent = "Rain event " + rainEventCounter.ToString();
string eventDir = Path.Combine(AnimatedGifDirectory, AnimatedGifDirectoryEvent);
if (!Directory.Exists(eventDir))
{
    Directory.CreateDirectory(eventDir);
}

问题是,当我重新运行程序时,rainEventCounter为0,因此它会将新的outputFile放在第一个现有目录中。 我想要它做的是检查AnimatedGifDirectory中是否有任何目录:

确定编辑:

我现在在类的顶部添加了一个变量string [] dirs 在类构造函数中我做了:

dirs = Directory.GetDirectories(AnimatedGifDirectory);

现在,当我运行我的程序时,有0个子目录。 但后来我重新运行程序,例如3个目录。 现在dirs包含3个目录。

现在我希望下一次AnimatedGifDirectoryEvent将会是"雨事件4"作为子目录名而不是" Rain事件1"试。

当然,如果dirs长度为0,则AnimatedGifDirectoryEvent将为" Rain事件1"。

2 个答案:

答案 0 :(得分:3)

您有多种方法可以获得它。首先,您可以获取Directory数组的Length,然后返回该数组。像:

public static int GetNextNumber(string directoryPath)
{
    var dirs = Directory.GetDirectories(directoryPath);
    return dirs.Length + 1;
}

或者您可以将目录名中的数字解析为int,从中获取Max并返回+ 1.

public static int GetNextNumberWithParsing(string directoryPath)
{
    var dirs = Directory.GetDirectories(directoryPath);
    var number = dirs.Select(r => int.Parse(r.Replace("Rain event ", ""))).Max();
    return number + 1;
}

然后在您的应用程序中调用它,如:

rainEventCounter = GetNextNumberWithParsing(AnimatedGifDirectory);

使用第一种方法的唯一问题是如果您的目录被删除(可能是由于一些清理工作),那么Length 可以返回无效的目录名。考虑一下你是否有以下目录:

Raise event 1
Raise event 2
Raise event 3
Raise event 4

然后,如果您使用dir.Length,它将返回4,然后您可以使用dir.Length + 1作为下一个名称。

但是如果在这种情况下目录1和2被删除,你将得到一个长度为2,你的下一个目录号将是3,现在它将抛出一个错误,因为具有该名称的目录已经存在。

答案 1 :(得分:2)

您在dirs变量的根目录中拥有目录数。使用dirs.Length + 1设置新目录名称。

AnimatedGifDirectoryEvent = "Rain event " + (dirs.Length + 1);