【问题标题】:C# Append Timestamp to FilepathC# 将时间戳附加到文件路径
【发布时间】:2021-07-22 00:31:03
【问题描述】:

我有以下问题或疑问, 我有这个功能

private void SavePic(Canvas canvas, string filename)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap(
         (int)canvas.Width, (int)canvas.Height,
         96d, 96d, PixelFormats.Pbgra32);
        // needed otherwise the image output is black
        canvas.Measure(new Size((int)canvas.Width, (int)canvas.Height));
        canvas.Arrange(new Rect(new Size((int)canvas.Width, (int)canvas.Height)));

        renderBitmap.Render(canvas);

        //JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderBitmap));

        using (FileStream file = File.Create(filename))
        {

            encoder.Save(file);
        }
    }

以及相应的调用 SavePic(mySuperDefaultPainting, @"C:\KinDraw\out.png");

现在我想附上日期+时间的文件名? 你可以在函数调用中抓取这个DateTime函数吗?

也许我可以在这里帮忙?

【问题讨论】:

标签: c# file-io timestamp


【解决方案1】:

尝试(已更新文件路径)

string fileName=string.Format("{0}-{1:ddMMMyyyy-HHmm}.png", @"C:\KinDraw\out", 
                                                    DateTime.Now);
if(!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

SavePic(mySuperDefaultPainting, fileName);

假设时间是 29-JAN-2013 07:30 PM,它会给你:C:\KinDraw\out-29JAN2013-1930.png

但请在this MSDN page 上查看有关CreateDirectory 的详细信息。还要寻找 Exceptions 并包裹在 try-catch 块中。

【讨论】:

  • 感谢所有提示和建议,但如果输出目录不存在,他总是抱怨和崩溃?如果目录不存在,Gibts 有办法创建目录吗?
【解决方案2】:
string timestamp =DateTime.Now.ToString("MMddyyyy.HHmmss");
SavePic(mySuperDefaultPainting, @"C:\KinDraw\out"+timestamp+".png");

更新:(如果目录不存在则创建)

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

希望对你有帮助:)

【讨论】:

  • 感谢所有提示和建议,但如果输出目录不存在,他总是抱怨和崩溃?如果目录不存在,Gibts 有办法创建目录吗?
  • @Avishek 在检查目录并给出以文件结尾的路径时,您更新的语句将始终返回 false。
  • @viv1d : 不,您只需将目录名(不带文件名)分配给filepath
【解决方案3】:

尝试在代码开头添加:

var extension = Path.GetExtension(filename);
var newName = filename.Replace(filename, extension) + DateTime.Now.ToString("yyyy-MM-dd HH:mm:dd") + extension;

【讨论】:

  • string.Format() 是你的朋友。
  • 感谢所有提示和建议,但如果输出目录不存在,他总是抱怨和崩溃?如果目录不存在,Gibts 有办法创建目录吗?
【解决方案4】:

只要把这一行放在那里:

string stampedFileName = filename.Replace(".",
    string.Format("{0:YYYY-mm-dd hhmmss}", DateTime.UtcNow) + ".");

然后改变

using (FileStream file = File.Create(filename))

using (FileStream file = File.Create(stampedFilename))

使用DateTime.UtcNow 而不是DateTime.Now 很重要,因为前者不受夏令时的影响。

编辑:我在上面提出的格式的优点是按字母顺序对文件名进行排序,然后自动按时间顺序对它们进行排序。

【讨论】:

  • 感谢所有提示和建议,但如果输出目录不存在,他总是抱怨和崩溃?如果目录不存在,Gibts 有办法创建目录吗?
  • if (!Directory.Exist(path)) { Directory.CreateDirectory(path); }
【解决方案5】:

我就是这样做的,而且效果很好。稍微调整了@Avishek 代码以使其适用于我。无需删除文件或丢失其中的内容。

输出文件后调用“Rename()”方法..

public static void Rename()
        {
            string timestamp = DateTime.Now.ToString("MMddyyyy.HHmmss"); 
            string originalFile = @"C:\Users\Data_Output\" + fileName + ".csv"; 
            string newFile = @"C:\Users\Data_Output\" + fileName + "_" + timestamp + ".csv";

            File.Move(originalFile, newFile);

        }

【讨论】:

  • 这是一个向后的解决方案。无需先用错误的名称保存文件,然后将其重命名为正确的名称。只需第一次用正确的名称保存即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多