找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 13471|回复: 5

ACE笔记(10)-ACE文件操作

[复制链接]
发表于 2008-7-15 23:54:13 | 显示全部楼层 |阅读模式
ACE里的文件操作与平常的Win32里面的文件操作有所不同,这是因为ACE是为网络开发而设计的,里面普遍都遵循了Client/Server模式,这样在操作文件时,ACE把文件看做是一个Socket服务器,而进行文件操作的类(ACE_FILE_IO)被看做是一个Socket Client。         有了上面的认识,使用ACE的文件操作就容易理解了:
        调用ACE_FILE_IO.send(...)其实就是进行写文件的操作;
        调用ACE_FILE_IO.recv(...)其实就是进行文件的读操作。
       ACE里面的文件操作类主要包括:ACE_IO_SAP、ACE_FILE、ACE_FILE_IO、ACE_FILE_Connector。
       ACE_FILE_Connector是一个用来产生ACE_FILE_IO的类工厂。
      ACE_FILE_IO继承于ACE_FILE,ACE_FILE继承于ACE_IO_SAP。
      ACE_FILE只能够对文件进行一些整体性的操作,如:关闭文件(close)、删除文件(remove/ulink)、获取文件属性(get_info)、设置文件大小(truncate)、定位或获取文件游标位置(seek/position/tell)、获取文件路径(get_local_addr/get_remote_addr)。
      ACE_FILE_IO则能够进行文件的读写操作,如:多个版本的send/recv, send_n/recv_n,  sendv/recvv,  sendv_n/recvv_n
      ACE_FILE_Connector实际是为了使ACE_FILE类族能够符合Connector/Acceptor设计模式而设计的,只是没有相应的Acceptor。
示例代码如下:
  1. #include "ace/OS_main.h"
  2. #include "ace/FILE_Addr.h"
  3. #include "ace/FILE_Connector.h"
  4. #include "ace/FILE_IO.h"
  5. #include "ace/OS_NS_string.h"
  6. #include "ace/OS_NS_stdio.h"
  7. ACE_RCSID(FILE_SAP, client, "client.cpp,v 4.16 2003/11/01 11:15:23 dhinton Exp")
  8. int
  9. ACE_TMAIN (int argc, ACE_TCHAR *argv[])
  10. {
  11.   if (argc < 3 || argc > 3)
  12.     ACE_ERROR_RETURN ((LM_ERROR,
  13.                        "usage: %s filename string\n",
  14.                        argv[0]),
  15.                       1);
  16.   ACE_TCHAR *readback = new ACE_TCHAR[ACE_OS::strlen (argv[1]) + 1];
  17.   readback[ACE_OS::strlen (argv[1])] = '\0';
  18.   ACE_TCHAR *filecache = new ACE_TCHAR[1024];
  19.   ACE_FILE_Info fileinfo;
  20.   ACE_FILE_IO cli_file;
  21.   ACE_FILE_IO file_copy;
  22.   ACE_FILE_Connector con;
  23.   if (con.connect (cli_file,
  24.                    ACE_FILE_Addr (argv[1]),
  25.      0,
  26.                    ACE_Addr::sap_any, 0,
  27.      O_RDWR|O_APPEND|O_CREAT,
  28.                    ACE_DEFAULT_FILE_PERMS) == -1)
  29.     ACE_ERROR_RETURN ((LM_ERROR,
  30.                        "%p\n to %s",
  31.                        "connect",
  32.                        argv[1]),
  33.                       -1);
  34.   if (con.connect ( file_copy,
  35.      ACE_FILE_Addr ("testfile_cpy.bak"),
  36.      0,
  37.      ACE_Addr::sap_any, 0,
  38.      O_RDWR|O_APPEND|O_CREAT,
  39.      ACE_DEFAULT_FILE_PERMS) == -1)
  40.    ACE_ERROR_RETURN ((LM_ERROR,
  41.      "%p\n to %s",
  42.      "connect",
  43.      "testfile_cpy.bak"),
  44.      -1);
  45.   ssize_t len = ACE_OS::strlen (argv[2]) + 1;
  46.   if (cli_file.send (argv[2], len) != len)
  47.     ACE_ERROR_RETURN ((LM_ERROR,
  48.                        "%p\n",
  49.                        "send"),
  50.                       1);
  51.   if (cli_file.get_info (&fileinfo) == -1)
  52.     ACE_ERROR_RETURN ((LM_ERROR,
  53.                        "%p\n",
  54.                        "get_info"),
  55.                       1);
  56.   else
  57.     ACE_OS::printf ("fileinfo : mode = %o\nno of links = %lu\nsize = %lu\n",
  58.                     (u_int) fileinfo.mode_ & 0777,
  59.                     ACE_static_cast(u_long ,fileinfo.nlink_),
  60.                     (u_long) fileinfo.size_);
  61.   off_t fpos = cli_file.position ();
  62.   if (fpos == -1)
  63.     ACE_ERROR_RETURN ((LM_ERROR,
  64.                        "%p\n",
  65.                        "position"),
  66.                       1);
  67.   else
  68.     ACE_OS::printf ("current filepointer is at %ld\n",
  69.                     (long int) fpos);
  70.   if (cli_file.position (0,
  71.                          SEEK_SET) == -1)
  72.     ACE_ERROR_RETURN ((LM_ERROR,
  73.                        "%p\n",
  74.                        "position"),
  75.                       1);
  76.   unsigned long lfsize = (u_long) fileinfo.size_;
  77.   if (lfsize <= 1024)
  78.   {
  79.   if (cli_file.recv(filecache, lfsize) != lfsize)
  80.    ACE_ERROR_RETURN ((LM_ERROR,
  81.         "%p\n",
  82.         "recv"),
  83.         1);
  84.   if (file_copy.send (filecache, lfsize) != lfsize)
  85.    ACE_ERROR_RETURN ((LM_ERROR,
  86.        "%p\n",
  87.        "send"),
  88.        1);
  89.   }
  90.   else
  91.   {
  92.    unsigned int uiTemp = lfsize;
  93.    while (uiTemp - 1024 >= 0)
  94.    {
  95.    if (cli_file.recv(filecache, 1024) != 1024)
  96.     ACE_ERROR_RETURN ((LM_ERROR,
  97.          "%p\n",
  98.          "recv"),
  99.          1);
  100.    if (file_copy.send (filecache, 1024) != 1024)
  101.     ACE_ERROR_RETURN ((LM_ERROR,
  102.         "%p\n",
  103.         "send"),
  104.         1);
  105.    uiTemp -= 1024;
  106.    }
  107.   }
  108.   if (cli_file.recv (readback, len) != len)
  109.     ACE_ERROR_RETURN ((LM_ERROR,
  110.                        "%p\n",
  111.                        "recv"),
  112.                       1);
  113.   ACE_OS::printf ("read back :%s\n",
  114.                   ACE_TEXT_ALWAYS_CHAR(readback));
  115.   if (cli_file.close () == -1 || file_copy.close() == -1)
  116.     ACE_ERROR_RETURN ((LM_ERROR,
  117.                        "%p\n",
  118.                        "close"),
  119.                       1);
  120.   return 0;
  121. }
  122. 除了上面提供的基本文件操作类外,ACE还提供了对配置文件进行操作的类,如对INI文件进行操作,当然也可以对XML文件进行操作
  123. 对INT文件进行操作的相关类如下:
  124. ACE_Configuration_Heap 用于获得配置文件的信息
  125. ACE_Ini_ImpExp 用于导入配置文件信息
  126.   ACE_Configuration_Section_Key 用于定位配置文件的章节
  127.   示例如下:
  128. CIniFile.h 文件
  129. #ifndef CINIFILE
  130. #define CINIFILE
  131. #include "ace/Configuration.h"
  132. #include "ace/Configuration_Import_Export.h"
  133. class CIniFile
  134. {
  135. public:
  136. ~CIniFile();
  137. //返回0表打开成功,-1表打开配置文件失败,-2表不存在【CRB】章节
  138. int open(const ACE_TCHAR * filename);
  139. int GetKeyValue(const ACE_TCHAR * name,ACE_TString &value);
  140. protected:
  141. private:
  142. ACE_Configuration_Section_Key root_key_;
  143. ACE_Ini_ImpExp * impExp_;
  144. ACE_Configuration_Heap config;
  145. //ACE_TCHAR[1000] tmp_;
  146. };
  147. #endif
  148. CIniFile.cpp 文件
  149. #include "CIniFile.h"
  150. CIniFile::~CIniFile(){
  151. delete this->impExp_;
  152. }
  153. int CIniFile::open(const ACE_TCHAR * filename){
  154. this->config.open();
  155. this->impExp_=new ACE_Ini_ImpExp(config);
  156. if (this->impExp_->import_config(filename)==-1){
  157.   return -1;
  158. }
  159. if (config.open_section(config.root_section(),ACE_TEXT("CRB"),0,this->root_key_)==-1){
  160.   return -2;
  161. }
  162. return 0;
  163. }
  164. int  CIniFile::GetKeyValue(const ACE_TCHAR * name,ACE_TString &value){
  165. return config.get_string_value(this->root_key_,name,value);
  166. }
复制代码
发表于 2008-7-23 09:18:04 | 显示全部楼层

LZ 有点问题

我参考你提供的读取配置文件的代码,然后在open的时候传入"logging.ini"的文件名称,
程序提示 打印出错误,程序提示没有该路径或者文件名。

还有程序马上崩溃!
发表于 2008-7-28 13:45:41 | 显示全部楼层

不能编译,改动几处就可以了............

#include "ace/OS_main.h"
#include "ace/FILE_Addr.h"
#include "ace/FILE_Connector.h"
#include "ace/FILE_IO.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_stdio.h"
ACE_RCSID(FILE_SAP, client, "client.cpp,v 4.16 2003/11/01 11:15:23 dhinton Exp")
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  if (argc < 3 || argc > 3)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "usage: %s filename string\n",
                       argv[0]),
                      1);
  ACE_TCHAR *readback = new ACE_TCHAR[ACE_OS::strlen (argv[1]) + 1];
  readback[ACE_OS::strlen (argv[1])] = '\0';
  ACE_TCHAR *filecache = new ACE_TCHAR[1024];
  ACE_FILE_Info fileinfo;
  ACE_FILE_IO cli_file;
  ACE_FILE_IO file_copy;
  ACE_FILE_Connector con;
  if (con.connect (cli_file,
                   ACE_FILE_Addr (argv[1]),
     0,
                   ACE_Addr::sap_any, 0,
     O_RDWR|O_APPEND|O_CREAT,
                   ACE_DEFAULT_FILE_PERMS) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n to %s",
                       "connect",
                       argv[1]),
                      -1);
  if (con.connect ( file_copy,
     ACE_FILE_Addr ("testfile_cpy.bak"),
     0,
     ACE_Addr::sap_any, 0,
     O_RDWR|O_APPEND|O_CREAT,
     ACE_DEFAULT_FILE_PERMS) == -1)
   ACE_ERROR_RETURN ((LM_ERROR,
     "%p\n to %s",
     "connect",
     "testfile_cpy.bak"),
     -1);
  ssize_t len = ACE_OS::strlen (argv[2]) + 1;
  if (cli_file.send (argv[2], len) != len)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "send"),
                      1);
  if (cli_file.get_info (&fileinfo) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "get_info"),
                      1);
  else
    ACE_OS::printf ("fileinfo : mode = %o\nno of links = %lu\nsize = %lu\n",
                    (u_int) fileinfo.mode_ & 0777,
                    ACE_static_cast(u_long ,fileinfo.nlink_),
                    (u_long) fileinfo.size_);
  off_t  fpos = cli_file.tell();    // off_t fpos = cli_file.position ();
  if (fpos == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "position"),
                      1);
  else
    ACE_OS::printf ("current filepointer is at %ld\n",
                    (long int) fpos);
  // if (cli_file.position (0,
    //                     SEEK_SET) == -1)
   if (cli_file.seek (0,
                        SEEK_SET) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "position"),
                      1);
  unsigned long lfsize = (u_long) fileinfo.size_;
  if (lfsize <= 1024)
  {
  if (cli_file.recv(filecache, lfsize) != lfsize)
   ACE_ERROR_RETURN ((LM_ERROR,
        "%p\n",
        "recv"),
        1);
  if (file_copy.send (filecache, lfsize) != lfsize)
   ACE_ERROR_RETURN ((LM_ERROR,
       "%p\n",
       "send"),
       1);
  }
  else
  {
   unsigned int uiTemp = lfsize;
   while (uiTemp - 1024 >= 0)
   {
   if (cli_file.recv(filecache, 1024) != 1024)
    ACE_ERROR_RETURN ((LM_ERROR,
         "%p\n",
         "recv"),
         1);
   if (file_copy.send (filecache, 1024) != 1024)
    ACE_ERROR_RETURN ((LM_ERROR,
        "%p\n",
        "send"),
        1);
   uiTemp -= 1024;
   }
  }
  if (cli_file.seek (0,
                        SEEK_SET) == -1)    //  add
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "position"),
                      1);
  if (cli_file.recv (readback, len) != len)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "recv"),
                      1);
  ACE_OS::printf ("read back :%s\n",
                  ACE_TEXT_ALWAYS_CHAR(readback));
  if (cli_file.close () == -1 || file_copy.close() == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "close"),
                      1);
  return 0;
}
发表于 2013-3-21 18:42:42 | 显示全部楼层
我用ACE_FILE_IO写文件, 发现系统缓存不断增加, 楼主知道是怎么回事吗? 写函数使用的 send
发表于 2013-4-21 13:08:05 | 显示全部楼层
lihaowei2028 发表于 2013-3-21 18:42
我用ACE_FILE_IO写文件, 发现系统缓存不断增加, 楼主知道是怎么回事吗? 写函数使用的 send ...

缓存在起作用啊。
发表于 2013-7-11 09:03:48 | 显示全部楼层
此贴有用!:)
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 11:09 , Processed in 0.018974 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表