2013-02-25 58 views
0

我有一個使用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

您是否檢查過,如果您的'timeinfo *'包含有效數據? – 2013-02-25 09:25:44

+2

@ bash.d更可能的問題是他在Windows下。 'asctime'在其格式中使用冒號,Windows不允許在文件名中使用冒號(除了特殊用途,如初始設備說明符或輔助流)。 – 2013-02-25 09:30:18

+0

@JamesKanze很高興知道! – 2013-02-25 09:31:02

回答

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))

+0

感謝您的回答,但它的工作,但我仍然需要寬字符文件名 – Engine 2013-02-25 10:02:59

+1

@Engine爲什麼? Windows將同時接受本地磁盤,但如果您想要備份(可能通過NFS),或執行其他任何可能導致文件被非Windows系統看到的情況,您將遇到麻煩。 (這兩種方式都有效:我在Linux下生成包含冒號的文件名時遇到了問題,當文件系統安裝在Windows機器上時,導致問題沒有結束。)但是,如果您必須:只需將生成的字符串複製到'std :: wstring'(使用兩個迭代器構造函數)。如果文件名是純ASCII,這將起作用。 – 2013-02-25 10:06:59

+0

@Engine無論如何,我已經編輯了答案來解釋這一點。 – 2013-02-25 10:11:59

1

asctime增加'\ N'在返回字符串的末尾字符,其不是有效的文件名

呼叫的ctime(t)是與asctime(本地時間(T))。它 日曆時間t轉換成 形式

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

嘗試使用的strftime的空終止字符串isntead

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

不要使用'「%R」'。這將在Windows下的文件名中插入冒號,這不是合法的字符。 – 2013-02-25 10:08:12

1

wchar_t *LPCOLESTR不兼容的類型,在運行時。你讀過this BSTR manual嗎?它會告訴你如何正確分配你的BSTR。