把时间作为文件名

时间:2013-02-25 09:06:21

标签: c++ c directshow

我有一个使用Direct-show抓取视频的程序。我的问题是我希望保存的视频有时间作为名称。这就是我所做的:

CoInitialize(NULL);
CComPtr<IGraphBuilder> graph;
graph.CoCreateInstance(CLSID_FilterGraph);
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
wchar_t pathstuff[50];
swprintf(pathstuff, L"D:\\BMDvideos\\%hs.avi", asctime(timeinfo));
LPCOLESTR x = pathstuff;
HRESULT hr = BuilGraph(graph,x);
..........

这不起作用,任何想法我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

格式化时间的函数是strftime,所以你可以这样做 类似的东西:

char filename[1000];
size_t l = strftime( filename,
                     sizeof(filename),
                     "D:/BMDvideos/%Y-%m-%dT%Hh%Mm%S.avi",
                     timeinfo );
assert( l != 0 );

几条评论:

  • 想要宽字符文件名。他们不是 标准,并没有得到广泛支持。 (通用标准) Unicode文件名是UTF-8,它可以在任何地方使用。在 事实上,你不希望在你以外的任何地方使用宽字符 程序)。

  • 您不能使用任何标准格式化功能,例如 asctime,因为他们几乎肯定会使用冒号(':') 时间格式,冒号是文件名中的非法字符 在Windows下。您必须自己指定确切的格式, 使用strftime

  • 你可能应该避免很多其他角色 同样。我倾向于将我的文件名限制为字母数字, 下划线,连字符和点,我对这个问题不太确定 连字符的可移植性,或具有多个点的名称。如果 名字不供人类消费,我只是用 "%Y%m%d%H%M%S",没有分隔符。

  • 最后,使用ISO订购非常有用(年,月, 日期,因为这意味着词典排序 对应于日期的排序。

编辑:

因为您说必须使用wchar_t文件名(即 一个非常糟糕的政策):你仍然可以使用上面的生成 文件名,然后只需使用即可将其转换为std::wstring std::wstring( filename, filename + strlen( filename ) )

答案 1 :(得分:1)

asctime在返回的字符串末尾添加'\ n'字符,该字符串对文件名无效

  

调用ctime(t)等同于asctime(localtime(t))。它   将日历时间t转换为以空字符结尾的字符串          形式

          "Wed Jun 30 21:49:08 1993\n"

尝试使用strftime isntead

char name[100]
strftime(name, 100, "%F_%R", timeinfo);

答案 2 :(得分:1)

wchar_t *LPCOLESTR在运行时不兼容。你看过this BSTR manual了吗?它会告诉你如何正确分配你的BSTR。