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

本文关键字:文件 新目录 新文件 创建 何确保 确保 如果 关闭程序 运行 | 更新日期: 2023-09-27 18:27:40

我有这个方法:

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:中是否有任何目录

OK编辑:

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

dirs = Directory.GetDirectories(AnimatedGifDirectory);

所以现在当我运行我的程序时,有0个子目录。但是,我再次运行程序,例如有3个目录。现在dirs包含3个目录。

现在我希望下一次AnimatedGifDirectoryEvent将是"Rain event 4"作为子目录名,而不是"Rain event 1"。

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

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

有多种方法可以获取它。首先,您可以获取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,现在它将抛出一个错误,因为具有该名称的目录已经存在。

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

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