如何检查文件完全到达/复制?

时间:2015-08-06 06:11:31

标签: c linux file file-read

每当文件到达/复制到该文件夹​​时,我们都有一个处理特定文件夹中文件的服务。现在,在文件到达之前,服务正在处理并且失败并出现错误。现在,如何在文件完全复制时检查和阅读?

该服务在Linux上运行。之后,失败“ERR_READING”,该过程将休眠5秒。甚至,该过程无法读取文件。可能在完全复制之前读取文件可能会破坏文件

以下是我们用来从文件中读取数据的代码:

int file_read( char *fname, TRANSACTION **tr )
{
    int ret;
    FILE    *fp;

    fp = fopen( fname, "r" );
    if( fp == NULL )
    {
        return( NO_FILE );
    }

    if(( ret = tr_read_tran( fp, tr ))!=0)
        {
        sleep(5);
        ret = tr_read_tran( fp, tr );
    }

    fclose( fp );

    return( ret );
}


static int tr_read_tran( FILE *fp, TRANSACTION **tr )
{
    int ret,
        t;
    char    *p,
        *bkpt,
        buf[ BUFSIZE ];

    if( fgets( buf, BUFSIZE, fp ) == NULL )
    {
        return( ERR_READING );   ***//Failing here because of file not completeley arrived***
    }
   ....
   ...
   ret = //gets value for ret

    return( ret )
}

4 个答案:

答案 0 :(得分:1)

您可以为下载的文件创建单独的文件夹。 然后只需将它们重命名/移动到工作目录。

另一种方法可能是添加一些" special"字符,告诉服务文件仍然下载。

答案 1 :(得分:0)

您应该将 ret 设置为tr_read_tran()函数中的某些内容...

#define NOT_ERROR 100000   // any value not zero

static int tr_read_tran( FILE *fp, TRANSACTION **tr )
{
    int ret = NOT_ERROR,
        t;
    char    *p,
        *bkpt,
        buf[ BUFSIZE ];

    if( fgets( buf, BUFSIZE, fp ) == NULL )
    {
        return( ERR_READING );   ***//Failing here because of file not completeley arrived***
    }

    return( ret )
}

目前它尚未初始化为任何值。

答案 2 :(得分:0)

这么多选项......

这里有几个:

  • 使用文件系统事件:
在Linux上

:  http://linux.die.net/man/7/inotify

Windows上的

:   https://msdn.microsoft.com/en-us/library/342da5th(v=vs.90).aspx

  • 在客户端和服务器上使用校验和,以确保文件完整性,然后再进行处理。

  • 在您的c程序中创建一个错误处理程序,以确保重试错误。想想try / catch,除了c实际上并不存在,所以改为使用setjmp和longjmp http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

答案 3 :(得分:0)

这个问题的简单解决方案是

1)生产者代码的变化:"让你的生产者(文件的创建者")将文件内容写入/ tmp文件夹;并将文件从/ tmp文件夹移动到源文件夹;

                             [or]

2)

a)制作人代码的变化:"让你的制作人用_part扩展名写入源foleder,如" Myfile.txt._part"写操作完成后,删除添加到它的最后一个扩展;所以文件名将是" Myfile.txt&#34 ;;

b)消费者代码的变化:"让您的消费者不要打开任何带有._part的最后一个扩展名的文件;