无法使用 remove() 路径删除文件夹中的文件是可以的

问题描述

我有以下代码删除文件时出错,但文件关闭,应该没有问题,知道我做错了什么,我也打印了路径,但没有字符这应该是一个问题并且权限是为了情节扭曲是文件已成功删除但该功能仍然提供-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 返回码,这应该可以让您了解错误的原因。