peakzhang 发表于 2008-1-15 21:48:38

如何进行64位文件的操作在ACE中

ACE_OS::fseek()中offset为long。问高手如何解决。
而且在ACE中没有找到关于filelengthi64的封装。如何得到64位文件大小.

peakzhang 发表于 2008-1-15 21:48:58

// Create a temporary filename.
ACE_FILE_Addr filename (ACE_sap_any_cast (ACE_FILE_Addr &));
if (fn != 0)
    filename.set (fn);

ACE_FILE_Connector connector;
ACE_FILE_IO file;
// Open up the file.
if (connector.connect (file,
                         filename,
                         0,
                         ACE_Addr::sap_any,
                         0,
((writing) ? (O_RDWR | O_CREAT) : O_RDONLY),
                         ACE_DEFAULT_FILE_PERMS) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                     ACE_TEXT ("connect failed for %p\n"),
                     filename.get_path_name ()),
                      1);用这种方式了!ACE中对文件的操作推荐用这种方法,ACE_OS::fseek()一类的操作只是为了提供对各平台的接口

peakzhang 发表于 2008-1-15 21:49:06

再说详细一些!

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。

peakzhang 发表于 2008-1-15 21:49:18

但问题是,如果是32位的系统,那么off_t也就是32位的,而ACE_FILE_Info中的off_t size_也就只能存储最大32位的值,这也普通的系统API调用是一样的,还是不能直接处理64位的文件长度。

peakzhang 发表于 2008-1-15 21:49:22

off_t定义是这样的

typedef long off_t;

在64位机器上,long是64位的!
页: [1]
查看完整版本: 如何进行64位文件的操作在ACE中