我有一个使用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);
..........
这不起作用,任何想法我怎么能这样做?
答案 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。