如何进行64位文件的操作在ACE中
ACE_OS::fseek()中offset为long。问高手如何解决。而且在ACE中没有找到关于filelengthi64的封装。如何得到64位文件大小. // 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()一类的操作只是为了提供对各平台的接口 再说详细一些!
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。 但问题是,如果是32位的系统,那么off_t也就是32位的,而ACE_FILE_Info中的off_t size_也就只能存储最大32位的值,这也普通的系统API调用是一样的,还是不能直接处理64位的文件长度。 off_t定义是这样的
typedef long off_t;
在64位机器上,long是64位的!
页:
[1]