2

我想创建一个带有“:”,“-”之类的字符的文件名。我尝试使用以下代码将日期和时间附加到我的文件名中。

Str.Format(_T("%d-%d-%d-%d:%d:%d.log"),systemTime.wDay ,systemTime.wMonth ,systemTime.wYear,systemTime.wHour,systemTime.wMinute,systemTime.wSecond);

std::wstring NewName=filename.c_str() + Str;

MoveFileEx(oldFilename.c_str(), NewName.c_str(), 2 )

MoveFileEx 因 Windows 错误代码 123(ERROR_INVALID_NAME)而失败。所以我认为问题出在我的新文件名上,其中包含“:”和“-”

谢谢,

4

3 回答 3

3

实际上,您不能:在 windows 文件名中使用该字符。用别的东西代替它。如果程序依赖于名称,则修改它以解释替代分隔符。

于 2013-03-25T09:07:52.247 回答
2

“我想创造……”不,你不想。不同的系统对文件名中的合法内容施加不同的约束。大多数现代系统确实允许相当长的名称(比如超过 100 个字符),并且不会对它们强加格式(尽管 Windows 仍然会处理最后一个之后的任何内容.,如果有的话,特别是,所以你要小心那里)。如果您不关心可移植性,您可以简单地遵循您所在系统的规则:在 Unix 下,no '/'or '\0'(但我也会避免 Unix shell 认为元字符的任何内容:any in ()[]{}<>!$|?*" \and the至少反引号),并且我会避免以'-'. Windows 正式禁止<>:"/\|?*; 在这里,我%,它可以被解释为一个shell变量),我还要小心,如果有一个.,最后.something对系统是有意义的。(如果文件名已经以类似的结尾.log,那么在此之前的附加点没有问题。)

在大多数情况下,最好保守一点。你永远不知道你将来会使用什么系统。在我自己的工作中(在 Linux 下通过创建带有冒号的文件名而被烧毁,并且以后在 Windows 下甚至无法删除它),我几乎采用了只允许 '-'、'_' 和字母数字字符(以及仅在大小写上有所不同的禁止文件名 - 我认识的不止几个人只会对字母使用小写字母)。这比 Unix 和 Windows 限制得多,但谁知道未来会怎样。(对于我过去工作过的一些系统来说,这也太自由了。但是,这些希望永远消失。)

于 2013-03-25T09:36:04.570 回答
2

Windows 不允许创建少数特殊字符作为文件名。

但是,要使用当前日期和时间创建文件名,您可以使用此格式。

CTime CurrentTime( CTime::GetCurrentTime() );
SampleFileName = CurrentTime.Format( _T( " %m_%d_%y %I_%M_%S" ) ) + fileExtension;

更多时间格式化,请参考这里

于 2013-03-26T06:57:46.973 回答