带有额外":"或"-" C++ 的可视文件名

visual Filename with an extra ":" or a "-" c++

本文关键字:C++ 可视 文件名      更新时间:2023-10-16

我想创建一个字符为":","-"的文件名。我尝试使用以下代码将日期和时间附加到我的文件名。

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 ErrorCode 123(ERROR_INVALID_NAME)。所以我认为问题是我的新文件名包含":"answers"-"

谢谢,

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

"我想创建…"不,你不需要。不同的系统对文件名中的合法内容有不同的限制。大多数现代系统都允许相当长的名称(比如超过100个字符),并且不会对它们施加格式(尽管Windows仍然处理最后一个.之后的任何内容,如果有的话,特别地,所以您要小心)。如果您不关心可移植性,您可以简单地遵循您所在系统的规则:在Unix下,没有'/'''(但我也会避免Unix shell认为是元字符的任何内容:至少()[]{}<>!$|?*" 和反打号中的任何内容),并且我会避免以'-'开头的文件名。Windows正式禁止<>:"/|?*中的任何内容;在这里,我将避免任何其他程序可能认为特殊的东西(包括使用两个%,它们可以被解释为shell变量),并且我还会注意,如果存在.,则最终的.something对系统是有意义的。(如果文件名已经以类似.log的内容结尾,那么在此之前添加点是没有问题的。)

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

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

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

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

更多时间格式,请参考