我在C中有一段代码在unix服务器上。他们是删除文件的程序,但是我需要在删除之前将该文件保存到不同的位置。
/* email the message and remove the temp email file.
*/
sprintf(szCmd,
"/usr/bin/mail -s\"lg_a17_srvr error\" %s < %s",
pszSupportAddr, pszTmpMsgFile);
if (system(szCmd) != 0) {
dce_dbgwrite(DCE_LOG_ERROR,
"Child %d: command to email error message failed: %s", iThisChild,
strerror(errno));
dce_dbgwrite(DCE_LOG_ERROR, "Child %d: email command = %s", iThisChild,
szCmd);
dce_dbgwrite(DCE_LOG_ERROR, "Child %d: email message = <%s>",
iThisChild, szEmailMsg);
}
**remove(pszTmpMsgFile);**
}
我需要先保存此文件 pszTmpMsgFile ,然后再将其移至不同位置。
请帮忙
答案 0 :(得分:1)
你可以像这样修改代码:
if (system(szCmd) != 0) {
char szCmd2[4096];
snprintf(szCmd2, sizeof(szCmd2), "mv %s %s.saved", pszTmpMsgFile, pszTmpMsgFile);
system(szCmd2);
dce_dbgwrite(DCE_LOG_ERROR,
"Child %d: command to email error message failed: %s", iThisChild,
strerror(errno));
dce_dbgwrite(DEC_LOG_ERROR,
"Mail file saved to %s.saved", pszTmpMsgFile);
请注意,它会将文件移开(但在与之前相同的目录中),并报告文件已保存。我甚至会在邮件中的文件名后添加please remove it soon
。我没有费心去测试移动是否成功 - 如果失败,没有多少人可以做。另请注意,这是一个重量级的解决方案。另一种方法是使用link()
函数:
if (system(szCmd) != 0) {
char szSaveFile[4096];
snprintf(szSveFile, sizeof(szSaveFile), "%s.saved", pszTmpMsgFile);
link(pszTmpMsgFile, szSaveFile);
dce_dbgwrite(DCE_LOG_ERROR,
"Child %d: command to email error message failed: %s", iThisChild,
strerror(errno));
dce_dbgwrite(DEC_LOG_ERROR,
"Mail file saved to %s.saved", pszTmpMsgFile);
除了速度之外,这还有一个额外的好处,即不会影响删除原始文件的代码;它仍然存在,而mv
命令将其删除,清理代码可能会报告问题。