【问题标题】:if File.Exists & generate a sequence numberif File.Exists & 生成一个序列号
【发布时间】:2014-05-06 11:17:15
【问题描述】:

下面的 xml 用于图像输出目的,对我来说使用下面的 xml 代码输出图像没有任何问题。

public static void TIF(Document dc, SortedList<string, object> dcIndexes)
{
    string str1 = dcIndexes["Document,name"].ToString();
    string str2 = dcIndexes["Document,age"].ToString();
    string str5 = dcIndexes["Document,status"].ToString();
  string str3 = Path.Combine(Config.OutputFolder, DateTime.Now.ToString("yyyyMMdd"));
  if (!Directory.Exists(str3))
    Directory.CreateDirectory(str3);
  string str4 = Path.Combine(str3, str1 + "_" + str2 + "_" + str5 + ".tif");
  DocumentHistory dh = (DocumentHistory) null;
  string sourceFileName = ServiceES.FromSE(dc, out dh);
  if (File.Exists(str4))
    File.Delete(str4);
  File.Move(sourceFileName, str4);
  PTrace.LogInformation("{0} - TIF - {1}", (object) dc.Title, (object) str4);
}

现在的输出路径是\YYYYMMDD\NAME_AGE_STATUS.tif 如果“name”为空,图片名称将变为:\YYYYMMDD\_AGE_STATUS.tif 我现在遇到的问题是,数据库中有相同的年龄和状态。该图像将仅覆盖第一张图像,然后是第二张和第三张图像,最终只有一张图像。

我可以知道如何在后面添加一个流水号吗? 例如:\YYYYMMDD\_AGE_STATUS.tif (first image)\YYYYMMDD\_AGE_STATUS_001.tif (second image) 后跟 \YYYYMMDD\_AGE_STATUS_002.tif (third image). if can remove the "_" front of AGE will look better. example:\YYYYMMDD\AGE_STATUS_002.tif` 似乎是因为下面的代码不允许:

 if (File.Exists(str4))
  File.Delete(str4);

如果重复 tif,我如何在后面添加序列号 001,002,003? 现在有 10 个文件名重复。

_23_Single
_23_Single
_23_Single
_23_Single
_23_Single
_23_Single
_23_Single
_23_Single
_23_Single
_23_Single

变成:

    _23_Single
    _23_Single_001
    _23_Single_002
    _23_Single_003
    _23_Single_004
    _23_Single_005
    _23_Single_006
    _23_Single_007
    _23_Single_008
    _23_Single_009

或成为:

23_Single
23_Single_001
23_Single_002
23_Single_003
23_Single_004
23_Single_005
23_Single_006
23_Single_007
23_Single_008
23_Single_009

【问题讨论】:

标签: c# xml image


【解决方案1】:

您必须创建文件名,检查它,然后在文件存在时更改它。例如:

public static void TIF(Document dc, SortedList<string, object> dcIndexes)
{
    string str1 = dcIndexes["Document,name"].ToString();
    string str2 = dcIndexes["Document,age"].ToString();
    string str5 = dcIndexes["Document,status"].ToString();
    string str3 = Path.Combine(Config.OutputFolder, DateTime.Now.ToString("yyyyMMdd"));
    if (!Directory.Exists(str3))
        Directory.CreateDirectory(str3);

    // ********
    // find first available file name
    bool done = false;
    int sequence = 0;
    string str4;
    string baseName = str1 + "_" + str2 + "_" + str5;
    do
    {
        // change here ***
        string fname = baseName;
        if (sequence > 0)
            fname = fname + "_" + sequence.ToString();
        // end of change ***

        str4 = Path.Combine(str3, fname + ".tif");
        if (File.Exists(str4))
            ++sequence;
        else
            done = true;
    } while (!done);

    // str4 now contains the file name
    // ********

    DocumentHistory dh = (DocumentHistory) null;
    string sourceFileName = ServiceES.FromSE(dc, out dh);
    if (File.Exists(str4))
        File.Delete(str4);
    File.Move(sourceFileName, str4);
    PTrace.LogInformation("{0} - TIF - {1}", (object) dc.Title, (object) str4);
}

【讨论】:

  • 嗨,你可以直接从我的代码中编辑,我可以将它替换回我的位置。因为我不知道我应该将你的代码粘贴到哪一行。
  • @user2523188:我已更新我的答案以显示您将在何处插入该代码。另请注意,如果您使用有意义的变量名而不是 str1str3 等,您的代码会更容易理解。
  • 它的作品完美!但如果文件不存在,所有文件名也命名为 _0 ?例如:name_age_status_0
  • @user2523188:我修改了我的示例以展示如何更改它以按照您想要的方式生成名称列表。
【解决方案2】:

我只是数一下,已经存在多少个文件

string fileName = // your file name
int filesWithThisName = 1;
while(File.Exists(fileName))
{
  fileName = Path.Combine(str3, str1 + "_" + str2 + "_" + str5 + "_" + i.ToString("D3") + ".tif");
  i++;
}
// save file

【讨论】:

  • 您可以通过调用Directory.GetFiles 来做到这一点,尽管这将为您提供所有存在的文件,即使存在差距。也就是说,如果存在x_001x_003,但不存在x_002,您的代码将停在2 处,Directory.GetFiles 将为您提供所有文件。