问题描述
我有以下代码,删除文件时出错,但文件已关闭,应该没有问题,知道我做错了什么,我也打印了路径,但没有字符这应该是一个问题并且权限是为了情节扭曲是文件已成功删除但该功能仍然提供-1
while ((stdir = readdir(dirIn)) != NULL && iRet == R_OK)
{
if (strstr(stdir->d_name,tParametros.szArchEnTrada) != NULL)
{
memset (szRuta,0x00,sizeof(szRuta));
sprintf(szRuta,"%s/%s",tParametros.szPathEnTrada,stdir->d_name);
sprintf(szArchEnTrada,"%s",stdir->d_name);
strcpy(szArchProc,stdir->d_name);
if((pfdEnTrada = fopen(szRuta,"r")) == NULL)
{
fprintf(gpfdLogFile,"%s%sNo se pudo abrir el archivo de enTrada[%s]\n",LINEA,ctime(&tTimeNow),stdir->d_name);
iRet = R_ARCH_ENTR;
}
else
{
fprintf(gpfdLogFile,"%s%sSe abrio archivo de enTrada: [%s]\n",stdir->d_name);
bFlagOpenArchIn = B_TRUE;
fprintf(gpfdLogFile,"%s%sSe abrio archivo tmp: [%s.tmp]\n",stdir->d_name);
memset (szBuffer,sizeof(szBuffer));
memset (szBufferAux,sizeof(szBufferAux));
while((iRet == R_OK) &&
(fgets(szBuffer,MAX_VAR_ParaM,pfdEnTrada) != NULL))
{
ldCount++;
if(ldCount == 1)
continue;
if(ldCount == 2)
{
strcpy(szArchProc,cfnObtengoSecuencia(stdir->d_name));
/* Abrimos el archivo tmp */
memset (szRuta,sizeof(szRuta));
sprintf(szRuta,"%s/%s.tmp",tParametros.szPathTmp,szArchProc);
if((pfdTmp = fopen(szRuta,"w")) == NULL)
{
fprintf(gpfdLogFile,"%s%sNo se pudo abrir el archivo tmp[%s]\n",szArchProc);
iRet = R_ARCH_TMP;
bFlagOpenArchTmp = B_FALSE;
}
else
bFlagOpenArchTmp = B_TRUE;
}
else if(ldCount2 == tParametros.iMaxRegistros)
{
fclose(pfdTmp);
ldCount2 = 0;
strcpy(szArchProc,cfnObtengoSecuencia1(szArchProc));
memset (szRuta,szArchProc);
iRet = R_ARCH_TMP;
bFlagOpenArchTmp = B_FALSE;
}
else
bFlagOpenArchTmp = B_TRUE;
}
if (bFlagOpenArchTmp == B_TRUE)
{
strcpy(szBufferAux,ifnFormateo(szBuffer));
fputs(szBufferAux,pfdTmp);
ldCount2++;
}
memset (szBuffer,sizeof(szBuffer));
memset (szBufferAux,sizeof(szBufferAux));
}/*WHILE 2*/
}/* IF 2 */
}/* IF 1 */
fclose(pfdTmp);
}/*WHILE 1*/
/************TMP*********/
if ((dirTmp = opendir(tParametros.szPathTmp)) == NULL && iRet != R_OK)
{
fprintf(gpfdLogFile,"%s%sERROR no se puede abrir el directorio de enTrada[%s]\n",tParametros.szPathTmp);
return R_DIR_ENTR;
}
else
{
bFlagOpenDirTmp = B_TRUE;
fprintf(gpfdLogFile,"%s%sDirectorio [%s] abierto\n",tParametros.szPathTmp);
}
/* Abro el directorio de enTrada */
while ((stdir = readdir(dirTmp)) != NULL && iRet == R_OK)
{
if (!strcmp(stdir->d_name,".") == 0 && !strcmp(stdir->d_name,"..") == 0
&& strstr(stdir->d_name,"tmp") != NULL)
{
ldCant = 0;
strcpy(szArchAux,stdir->d_name);
memset (szRutaAux,sizeof(szRutaAux));
sprintf(szRutaAux,"%s%s",szArchAux);
iRet = ifnObtenerCant(szArchAux,&ldCant);
memset (szArchProc,sizeof(szArchProc));
strcpy(szArchProc,cfnObtenerNombre(szArchAux));
memset (szRuta,tParametros.szPathSalida,szArchProc);
if (rename(szRutaAux,szRuta) != R_ERROR)
fprintf(gpfdLogFile,"%s%sSe genera el archivo de salida [%s]\n",szRuta);
else
{
fprintf(gpfdLogFile,"%s%sERROR al generar el archivo de salida [%s]\n",szRuta);
iRet = R_ERROR;
}
if (remove(szRutaAux) == R_ERROR)
{
fprintf(gpfdLogFile,"%s%sERROR al eliminar el archivo tmp [%s]\n",szRutaAux);
iRet = R_ERROR;
}
}
}
#undef R_OK
#define R_OK 0
#undef R_ERROR
#define R_ERROR -1
解决方法
使用 szRutaAux
将其重命名为 szRuta
后,位于 rename(szRutaAux,szRuta)
的文件将不再存在。
在你的代码中输入以下内容
#include <errno.h>
.......
/*At remove */
if (remove(szRutaAux) == R_ERROR)
{
fprintf(gpfdLogFile,"%s%sERROR al eliminar el archivo tmp [%s]\n",LINEA,ctime(&tTimeNow),szRutaAux);
fprintf(gpfdLogFile,"Errno:%d",errno):
iRet = R_ERROR;
}
并检查 errno 返回码,这应该可以让您了解错误的原因。