每当文件到达/复制到该文件夹时,我们都有一个处理特定文件夹中文件的服务。现在,在文件到达之前,服务正在处理并且失败并出现错误。现在,如何在文件完全复制时检查和阅读?
该服务在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 )
}
答案 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)
这么多选项......
这里有几个:
: 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的最后一个扩展名的文件;