ACE的文件操作

来源:互联网 发布:淘宝 杰胜体育 编辑:程序博客网 时间:2024/05/16 14:13

面是一个使用多种方法进行文件拷贝操作的例子:

// 1、使用操作系统的函数进行逐个字符的拷贝. read/write/lseek

int
Slow_Read_Write_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
ACE_HANDLE ifd = fileno (input_fp);
ACE_HANDLE ofd = fileno (output_fp);

this->tm_.start ();

while (--iterations >= 0)
{
char c;

while (ACE_OS::read (ifd, &c, sizeof c) > 0)
::write (ofd, &c, sizeof c);

ACE_OS::lseek (ifd, 0, SEEK_SET);
ACE_OS::lseek (ofd, 0, SEEK_SET);
}

this->tm_.stop ();
return 0;
}

// 2. 使用标准C函数进行逐字符拷贝. getc/putc/rewind

int
Stdio_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
this->tm_.start ();

while (--iterations >= 0)
{
int c;

while ((c = getc (input_fp)) != EOF)
putc (c, output_fp);

ACE_OS::rewind (input_fp);
ACE_OS::rewind (output_fp);
}
this->tm_.stop ();
return 0;
}

// 3. 块读取. read/write/lseek

int
Block_Read_Write_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
int ifd = fileno (input_fp);
int ofd = fileno (output_fp);

this->tm_.start ();

while (--iterations >= 0)
{
char buf[BUFSIZ];
ssize_t n;

while ((n = ACE_OS::read (ifd,
buf,
sizeof buf)) > 0)
::write (ofd, buf, n);

ACE_OS::lseek (ifd, 0, SEEK_SET);
ACE_OS::lseek (ofd, 0, SEEK_SET);
}

this->tm_.stop ();
return 0;
}

// 4. fread/fwrite/lseek

int
Block_Fread_Fwrite_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
this->tm_.start ();

while (--iterations >= 0)
{
char buf[BUFSIZ];
ssize_t n;

while ((n = ACE_OS::fread (buf,
1,
sizeof buf,
input_fp)) != 0)
::fwrite (buf, n, 1, output_fp);

ACE_OS::rewind (input_fp);
ACE_OS::rewind (output_fp);
}

this->tm_.stop ();
return 0;
}

// 5. 使用内存映射文件打开输入文件,使用write 进行文件写操作

int
Mmap1_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
ACE_Mem_Map map_input (fileno (input_fp));
void *src = map_input.addr ();

if (src == MAP_FAILED)
ACE_ERROR_RETURN ((LM_ERROR,
"%s",
this->name ()),
-1);
else
{
this->tm_.start ();

while (--iterations >= 0)
{
if (ACE_OS::write (fileno (output_fp),
src,
map_input.size ()) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%s",
this->name ()),
-1);
ACE_OS::lseek (fileno (output_fp),
0,
SEEK_SET);
}

this->tm_.stop ();
}

if (map_input.unmap () == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%s",
this->name ()),
-1);
else
return 0;
}

// 6. 使用内存映射文件打开输入、输出文件, 使用memcpy 进行文件内容的拷贝

int
Mmap2_Test::run_test (int iterations,
FILE *input_fp,
FILE *output_fp)
{
ACE_Mem_Map map_input (fileno (input_fp));
int size = map_input.size ();
ACE_Mem_Map map_output (fileno (output_fp),
size,
PROT_WRITE,
MAP_SHARED);
void *src = map_input.addr ();
void *dst = map_output.addr ();

if (src == MAP_FAILED || dst == MAP_FAILED)
return -1;
else
{
this->tm_.start ();

while (--iterations >= 0)
ACE_OS::memcpy (dst, src, size);

this->tm_.stop ();
}

if (map_input.unmap () == -1
|| map_output.unmap () == -1)
return -1;
else
return 0;
}

原创粉丝点击