gpt4 book ai didi

c# - 如何修复我的代码以将已经存在的文件移动到另一个目录?

转载 作者:行者123 更新时间:2023-11-30 22:56:41 24 4
gpt4 key购买 nike

这是我的第一个 C# 脚本,也是第一个基于非 SQL 的脚本。我真的很自豪(如果没有这个社区的帮助,我不可能这么快完成,谢谢!),但我知道它会各种乱七八糟。

该脚本遍历单个目录中的所有文件,从文件名中删除特殊字符,并将文件重命名为标准的、用户友好的名称。该脚本正在目录中查找一组特定的文件。如果它发现一个不应该在目录中的文件,它会将文件移动到一个安全文件夹并重命名它。如果文件夹

我正在使用 4 个具有动态名称的文件,其中包含数字和特殊字符。重命名过程分两步进行:

  • 从名称中删除特殊字符和数字。例如:从“EOY 12.21.2018 - 12.28.2018 PRF.xls”到“EOYPRF.xls”
  • 重命名文件以清楚地标记文件是什么。例如:从“EOYPRF.xls”到“EOY_CompanyName.xls”

  • 可能有文件不小心添加到了这个目录中,而且由于是工资单文件,所以它们是高度 secret 的,除非需要移动,否则不能移动(仅当它们是 4 个文件之一时),所以我将它们移动到一个存储文件的同一目录中的子目录并重命名它们。

    我也试图解释我的脚本或流程是否在中途出现问题。此脚本是在 SSIS 中运行的更大自动化过程的一部分,因此存在许多故障点。脚本可能会失败并在目录中留下 4 个文件中的一个或全部。如果是这种情况,我需要在用户添加新的、未更改的要处理的主文件之前将文件移出主目录。如果该目录包含最终名称相同的文件(“EOY_CompanyName.xls”),则它将无法正常工作。

    我通过将三个场景放在目录中来测试脚本。
  • 2 个文件与 4 个主文件没有任何关联。
  • 4 个未更改的主文件,格式为数字和特殊字符:“EOY 12.21.2018 - 12.28.2018 PRF.xls”
  • 4 个主文件已经处于最终状态(在文件移动到最终目录之前模拟失败)。例如:“EOY_CompanyName.xls”

  • 我面临的问题是在目录中同时存在未更改的主文件和最终主文件的罕见情况下,脚本一直运行到第一个未更改的文件,删除特殊字符,然后在最后的重命名步骤中失败,因为文件已存在同名文件(上述 3 点中的场景 3)。然后它将继续运行脚本,并将其中一个主文件移动到意外的文件目录中,并由于某种原因停止处理任何其他文件。我真的需要有经验的人的帮助。

    我已经尝试了很多东西,但我认为这是处理文件的顺序问题。我有两个名为“a.xls”和“b.xls”的文件,它们是意外文件的占位符。它们是目录中的前两个文件,并且总是首先得到处理。目录中的第 3 个文件是上面以未更改形式命名的文件(“EOY 12.21.2018 - 12.28.2018 PRF.xls”)。它被重命名并移动到意外文件夹中,但实际上它应该被传递以将包含最终名称(“EOY_CompanyName.xls”)的主文件移动到意外文件夹中。我想确保脚本只在运行时处理新文件,所以我想将任何无法通过脚本移动的已处理文件移动到另一个目录中。
    public void Main()
    {
    ///Define paths and vars
    string fileDirectory_Source = Dts.Variables["User::PayrollSourceFilePath"].Value.ToString();
    string fileDirectory_Dest = Dts.Variables["User::PayrollDestFilePath"].Value.ToString();
    string errorText = Dts.Variables["User::errorText"].Value.ToString();
    DirectoryInfo dirInfo_Source = new DirectoryInfo(fileDirectory_Source);
    DirectoryInfo dirInfo_Dest = new DirectoryInfo(fileDirectory_Dest);
    string finalFileName = "";

    List<string> files = new List<string>(new string[]
    {
    fileDirectory_Source + "EOY_PRF.xls",
    fileDirectory_Source + "EOY_SU.xls",
    fileDirectory_Source + "FS_PRF.xls",
    fileDirectory_Source + "FS_SU.xls"
    });

    Dictionary<string, string> fileNameChanges = new Dictionary<string, string>();
    fileNameChanges.Add("EOYReportPRF.xls", "EOY_PRF.xls");
    fileNameChanges.Add("PayrollEOY.xls", "EOY_SU.xls");
    fileNameChanges.Add("PRFFundingStatement.xls", "FS_PRF.xls");
    fileNameChanges.Add("SUFundingStatement.xls", "FS_SU.xls");

    ///Determine if all files present
    int count = dirInfo_Source.GetFiles().Length;
    int i = 0;

    ///Loop through directory to standardize file names
    try
    {
    foreach (FileInfo fi in dirInfo_Source.EnumerateFiles())
    {

    string cleanFileName = Regex.Replace(Path.GetFileNameWithoutExtension(fi.Name), "[0-9]|[.,/ -]", "").TrimEnd() + fi.Extension;
    File.Move(fileDirectory_Source + Path.GetFileName(fi.Name), fileDirectory_Source + cleanFileName);
    ///Move unexpectd files in source directory
    if (!fileNameChanges.ContainsKey(cleanFileName))
    {
    errorText = errorText + "Unexpected File: " + cleanFileName.ToString() + " moved into the Unexpected File folder.\r\n";

    File.Move(dirInfo_Source + cleanFileName, dirInfo_Source + "Unexpected Files\\" + Path.GetFileNameWithoutExtension(cleanFileName) + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + fi.Extension);

    }
    if (fileNameChanges.ContainsKey(cleanFileName))
    {
    ///Final Friendly File Name from Dict
    var friendlyName = fileNameChanges[cleanFileName];
    ///Handle errors produced by files that already exist
    if (files.Contains(fileDirectory_Source + friendlyName))//File.Exists(fileDirectory_Source + friendlyName))
    {
    MessageBox.Show("File.Exists(dirInfo_Source + friendlyName)" + File.Exists(dirInfo_Source + friendlyName).ToString() + " cleanFileName " + cleanFileName);
    errorText = errorText + "File already exists: " + friendlyName.ToString() + " moved into the Unexpected File folder.\r\n";
    File.Move(dirInfo_Source + friendlyName, dirInfo_Source + "Unexpected Files\\" + Path.GetFileNameWithoutExtension(friendlyName) + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Path.GetExtension(friendlyName));
    return;
    }
    ///Rename files to friendly name
    File.Move(dirInfo_Source + cleanFileName, dirInfo_Source + friendlyName);
    finalFileName = friendlyName.ToString();
    }
    ///Count valid PR files
    if (files.Contains(dirInfo_Source + finalFileName))
    {
    i++;
    }
    }
    ///Pass number of files in source folder to SSIS
    Dts.Variables["User::FilesInSourceDir"].Value = i;
    }
    catch (Exception ex)
    {
    errorText = errorText + ("\r\nError at Name Standardization step: " + ex.Message.ToString()) + $"Filename: {finalFileName}\r\n";
    }

    ///Search for missing files and store paths
    try
    {
    if (i != 4)
    {
    var errors = files.Where(x => !File.Exists(x)).Select(x => x);
    if (errors.Any())
    errorText = (errorText + $" Missing neccessary files in PR Shared drive. Currently {i} valid files in directory.\r\n\n" + "Files missing\r\n" + string.Join(Environment.NewLine, errors) + "\r\n");
    }
    }
    catch (Exception ex)
    {
    errorText = errorText + ("Error at Finding Missing PR Files step: " + ex.Message.ToString()) + "\r\n\n";
    throw;
    }

    ///Loop through directory to move files to encrypted location
    try
    {
    if (i == 4)
    foreach (FileInfo fi in dirInfo_Source.EnumerateFiles())
    {
    fi.MoveTo(fileDirectory_Dest + Path.GetFileName(fi.FullName));
    }
    }
    catch (Exception ex)
    {
    errorText = errorText + ("Error at Move Files to Encrypted Directory step: " + ex.Message.ToString()) + "\r\n";
    }
    Dts.TaskResult = (int)ScriptResults.Success;
    Dts.Variables["User::errorText"].Value = errorText;
    }

    #region ScriptResults declaration
    /// <summary>
    /// This enum provides a convenient shorthand within the scope of this class for setting the
    /// result of the script.
    ///
    /// This code was generated automatically.
    /// </summary>
    enum ScriptResults
    {
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    #endregion

    }

    }

    理想情况下,我希望在需要清理和重命名文件之前移动文件夹中的所有文件,这样我就不会收到错误或将记录提交到已经存在的数据库中。

    如果您做到了这一步,感谢您抽出宝贵的时间,感谢您花时间阅读本文。你是英雄。

    最佳答案

    据我了解,如果“4 个短名称”中的任何一个在执行其他任何操作之前已经存在,您就想移除它们。我会去下面,请注意,我没有运行代码..
    我希望我理解你是正确的

    ///Loop through directory to standardize file names
    try
    {
    //Cleanup source folder
    foreach (string fileShortName in files)
    {
    if (File.Exists(fileDirectory_Source + fileShortName))
    {
    //Time to move the file, its old
    errorText = errorText + "Old File: " + fileShortName + " moved into the Old File folder.\r\n";

    File.Move(dirInfo_Source + fileShortName, dirInfo_Source + "Old Files\\" + Path.GetFileNameWithoutExtension(fileShortName) + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Path.GetExtension(fileShortName));
    }
    }

    foreach (FileInfo fi in dirInfo_Source.GetFiles())

    关于c# - 如何修复我的代码以将已经存在的文件移动到另一个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54240988/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com