无法删除具有 remove() 路径的文件夹中的文件没问题
Can't remove file in a folder with remove() path is ok
我有以下代码,删除文件时出错,但是文件已关闭,应该没问题,我知道我做错了什么,我也打印了路径并且有没有应该出现问题的字符和权限是为了情节转折是文件已成功删除但函数仍然提供 -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",
LINEA, ctime(&tTimeNow), stdir->d_name);
bFlagOpenArchIn = B_TRUE;
fprintf(gpfdLogFile, "%s%sSe abrio archivo tmp: [%s.tmp]\n",
LINEA, ctime(&tTimeNow), stdir->d_name);
memset (szBuffer,0x00,sizeof(szBuffer));
memset (szBufferAux,0x00,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, 0x00,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",
LINEA, ctime(&tTimeNow), 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, 0x00,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",
LINEA, ctime(&tTimeNow), 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,0x00,sizeof(szBuffer));
memset (szBufferAux,0x00,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",
LINEA, ctime(&tTimeNow), tParametros.szPathTmp);
return R_DIR_ENTR;
}
else
{
bFlagOpenDirTmp = B_TRUE;
fprintf(gpfdLogFile, "%s%sDirectorio [%s] abierto\n",
LINEA, ctime(&tTimeNow), 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, 0x00,sizeof(szRutaAux));
sprintf(szRutaAux,"%s%s", tParametros.szPathTmp, szArchAux);
iRet = ifnObtenerCant(szArchAux, &ldCant);
memset (szArchProc, 0x00,sizeof(szArchProc));
strcpy(szArchProc, cfnObtenerNombre(szArchAux));
memset (szRuta, 0x00,sizeof(szRuta));
sprintf(szRuta,"%s%s", tParametros.szPathSalida, szArchProc);
if (rename(szRutaAux, szRuta) != R_ERROR)
fprintf(gpfdLogFile, "%s%sSe genera el archivo de salida [%s]\n",
LINEA, ctime(&tTimeNow), szRuta);
else
{
fprintf(gpfdLogFile, "%s%sERROR al generar el archivo de salida [%s]\n",
LINEA, ctime(&tTimeNow), szRuta);
iRet = R_ERROR;
}
if (remove(szRutaAux) == R_ERROR)
{
fprintf(gpfdLogFile, "%s%sERROR al eliminar el archivo tmp [%s]\n",
LINEA, ctime(&tTimeNow), szRutaAux);
iRet = R_ERROR;
}
}
}
#undef R_OK
#define R_OK 0
#undef R_ERROR
#define R_ERROR -1
szRutaAux
处的文件在使用 rename(szRutaAux, szRuta)
重命名为 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 return 代码,这应该可以让您了解错误的原因。
我有以下代码,删除文件时出错,但是文件已关闭,应该没问题,我知道我做错了什么,我也打印了路径并且有没有应该出现问题的字符和权限是为了情节转折是文件已成功删除但函数仍然提供 -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",
LINEA, ctime(&tTimeNow), stdir->d_name);
bFlagOpenArchIn = B_TRUE;
fprintf(gpfdLogFile, "%s%sSe abrio archivo tmp: [%s.tmp]\n",
LINEA, ctime(&tTimeNow), stdir->d_name);
memset (szBuffer,0x00,sizeof(szBuffer));
memset (szBufferAux,0x00,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, 0x00,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",
LINEA, ctime(&tTimeNow), 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, 0x00,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",
LINEA, ctime(&tTimeNow), 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,0x00,sizeof(szBuffer));
memset (szBufferAux,0x00,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",
LINEA, ctime(&tTimeNow), tParametros.szPathTmp);
return R_DIR_ENTR;
}
else
{
bFlagOpenDirTmp = B_TRUE;
fprintf(gpfdLogFile, "%s%sDirectorio [%s] abierto\n",
LINEA, ctime(&tTimeNow), 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, 0x00,sizeof(szRutaAux));
sprintf(szRutaAux,"%s%s", tParametros.szPathTmp, szArchAux);
iRet = ifnObtenerCant(szArchAux, &ldCant);
memset (szArchProc, 0x00,sizeof(szArchProc));
strcpy(szArchProc, cfnObtenerNombre(szArchAux));
memset (szRuta, 0x00,sizeof(szRuta));
sprintf(szRuta,"%s%s", tParametros.szPathSalida, szArchProc);
if (rename(szRutaAux, szRuta) != R_ERROR)
fprintf(gpfdLogFile, "%s%sSe genera el archivo de salida [%s]\n",
LINEA, ctime(&tTimeNow), szRuta);
else
{
fprintf(gpfdLogFile, "%s%sERROR al generar el archivo de salida [%s]\n",
LINEA, ctime(&tTimeNow), szRuta);
iRet = R_ERROR;
}
if (remove(szRutaAux) == R_ERROR)
{
fprintf(gpfdLogFile, "%s%sERROR al eliminar el archivo tmp [%s]\n",
LINEA, ctime(&tTimeNow), szRutaAux);
iRet = R_ERROR;
}
}
}
#undef R_OK
#define R_OK 0
#undef R_ERROR
#define R_ERROR -1
szRutaAux
处的文件在使用 rename(szRutaAux, szRuta)
重命名为 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 return 代码,这应该可以让您了解错误的原因。