windows下截断文件的api函数是什么?

james_hw 2010-01-22 05:56:19
rt
...全文
617 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
tstongtai 2010-01-25
  • 打赏
  • 举报
回复
9楼的能在WINDOWS里运行不?很是烦恼自己编辑的程序只能在DOS窗口里运行
bobo364 2010-01-25
  • 打赏
  • 举报
回复
楼上是c++的?
赵4老师 2010-01-25
  • 打赏
  • 举报
回复
参考一下这个吧
#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_CLU_BYTES 65536
FILE *fo;
int fh;
__int64 offs,offs1;
__int64 rvi64;
int rv,wrv;
unsigned char buf[MAX_CLU_BYTES];
char ofn[_MAX_PATH];
void main(int argc,char **argv) {
if (argc<3) {
printf("Copy File Tail.\n");
printf("Usage:\n");
printf(" cft filename.ext offset_begin[-offset_end]\n");
printf("Copy filename.ext offset_begin[-offset_end] to offset_begin[-offset_end]-filename.ext\n");
printf("Note: Byte at offset_end is NOT included.\n");
printf("Example:\n");
printf(" cft abc.rar 12345\n");
printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");
printf(" cft abc.rar 123-12345\n");
printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");
printf(" cft abc.rar 0xAB-0xCD\n");
printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");
return;
}
rv=sscanf(argv[2],"%I64i-%I64i",&offs,&offs1);
if (rv==0) {
printf("offset %s is not number\n",argv[2]);
return;
}
fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR);
if (fh==-1) {
printf("_sopen %s errno=%d\n",argv[1],errno);
return;
}
if (rv==1) {
offs1=_filelengthi64(fh);
if (offs1==-1i64) {
printf("%I64=_filelengthi64 errno=%d\n",offs1,errno);
_close(fh);
return;
}
} else {//rv==2
if (offs1<offs) {
printf("%s offset_begin>offset_end error\n",argv[2]);
_close(fh);
return;
}
}
rvi64=_lseeki64(fh,offs,SEEK_SET);
if (rvi64!=offs) {
printf("%I64u=_lseeki64 %I64u errno=%d\n",rvi64,offs,errno);
_close(fh);
return;
}
sprintf(ofn,"%s-",argv[2]);
strcat(ofn,argv[1]);
fo=fopen(ofn,"wb");
if (fo==NULL) {
_close(fh);
printf("fopen %s error\n",ofn);
return;
}
cprintf("\n%I64u\r",offs);
while (1) {
rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));
if (rv==0) break;//
if (rv<0) {
fclose(fo);
_close(fh);
printf("_read %s offset %I64u error\n",argv[1],offs);
return;
}
wrv=fwrite(buf,1,rv,fo);
if (wrv!=rv) {
fclose(fo);
_close(fh);
printf("fwrite %s error\n",ofn);
return;
} else {
offs+=rv;
cprintf("%I64u\r",offs);
if (offs>=offs1) break;//
}
}
fclose(fo);
_close(fh);
printf("Copy %s offset %s to %s OK.\n",argv[1],argv[2],ofn);
}
james_hw 2010-01-25
  • 打赏
  • 举报
回复
你们说的都不合适,我要的是windows的api,
to shellfish567,记住,操作系统的api操作效率最高,像你的说法,不仅效率低,而且操作过程中可能出现失败。

to z569362161,这个我查过,需要先打开文件(而且是windows封装后的对象)然后设置,这个方法是正确的,不过我期待能找出更好的方法。(主要是我的程序需要跨windows和linux平台)
try_hard_2008 2010-01-25
  • 打赏
  • 举报
回复
截断文件是什么意思?
vincent_1011 2010-01-25
  • 打赏
  • 举报
回复
奇怪,C库的函数最终不也是要调用系统提供的API吗?都不知道你们说什么
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shellfish567 的回复:]
你是在WIN CE上开发的?OS接口?OSS我真没听说过,嵌入式开发我只做过LINUX的,CE的真没,不过相对于几MB的nand flash来说,不到1k的占用还是可以满足的吧?况且调用的也是标准动态链接库。即便是windows也会提供标准c的dll的,你根本不用占用太多资源,删除文件,你乱删肯定会崩溃了。好的一点是在nand flash上进行读写操作速度还是很不错的。不说了,看个人,喜欢用哪个用哪个引用 23 楼 jamesf1982 的回复:
当你到企业开发时,给你上的第一堂课就是用该企业开发的OSS接口,而不是C标准。当然,我不知道你开发时是否会考虑这些东西

[/Quote]

OSS,operation support system(操作支撑子系统)。该模块存在的原因就是我说的各种芯片和系统等之间存在差异性,未必能完好的支持C标准,因此该模块提供各种基本的接口供上层人员调用,以提高开发效率(就是java虚拟机的概念一样)

另外我不在wince开发,windows对c标准的支持很好,不过我更喜欢调用系统api。
shellfish567 2010-01-25
  • 打赏
  • 举报
回复
你是在WIN CE上开发的?OS接口?OSS我真没听说过,嵌入式开发我只做过LINUX的,CE的真没,不过相对于几MB的nand flash来说,不到1k的占用还是可以满足的吧?况且调用的也是标准动态链接库。即便是windows也会提供标准c的dll的,你根本不用占用太多资源,删除文件,你乱删肯定会崩溃了。好的一点是在nand flash上进行读写操作速度还是很不错的。不说了,看个人,喜欢用哪个用哪个[Quote=引用 23 楼 jamesf1982 的回复:]
当你到企业开发时,给你上的第一堂课就是用该企业开发的OSS接口,而不是C标准。当然,我不知道你开发时是否会考虑这些东西
[/Quote]
mstlq 2010-01-25
  • 打赏
  • 举报
回复
使用SetFileValidData
http://msdn.microsoft.com/en-us/library/aa365544(VS.85).aspx

第一个参数可以用CreateFile 获得
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx


这回两个都是api了,够用了吧?
james_hw 2010-01-25
  • 打赏
  • 举报
回复
当你到企业开发时,给你上的第一堂课就是用该企业开发的OSS接口,而不是C标准。当然,我不知道你开发时是否会考虑这些东西
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 shellfish567 的回复:]
我就在,我的代码里就有一个类似的模块,对一个大文件进行分块操作,这些简单功能都给你提供api会把人养懒的,不就是open了read嘛,当然实现判断大小进行分块读就OK,记得保存文件名,write进去就是,没啥难度了
[/Quote]

是的,没啥难度的,那你知道在工作中,除了你所说的c标准,你的文件系统也是很重要的一部分,举个简单的例子。你删除文件没什么难度吧,但是有可能会导致文件系统崩溃而且你根本不知道原因。在嵌入式中,当资源有限时,数据总线经常会被复用,这种情况下,你调用硬件人员(或者BSP开发人员)提供给你的接口就远远好于你调用c标准接口。
shellfish567 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jamesf1982 的回复:]
引用 16 楼 shellfish567 的回复:
晕倒,这个你慢慢纠结吧,我是能不用api就不用api,自作孽啊!


等到在工作中时,你自然知道写一个稳定的模块有多重要
[/Quote]我就在,我的代码里就有一个类似的模块,对一个大文件进行分块操作,这些简单功能都给你提供api会把人养懒的,不就是open了read嘛,当然实现判断大小进行分块读就OK,记得保存文件名,write进去就是,没啥难度了
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 shellfish567 的回复:]
输入文件名?然后?里边还不是要open然后读出写入啥的,根本就没啥区别,好好的c标准库不用非得去找MFC里的api………………引用 13 楼 jamesf1982 的回复:
引用 12 楼 vincent_1011 的回复:
晕死,有API是运行期能跨平台的吗?

win下就是楼上上上上说的setendoffile.这已经是SDK了。
linux就不知道了


呵呵,可能我说的不正确,其实是自己搭建一个平台用于屏蔽windows和linux之间的差异。现在我的解决方法是用io打开文件,然后chsize来截断,不过一定得打开文件才行,很烦,想找找看windows有没有像linux那样直接根据文件名来裁剪的函数

[/Quote]

这不是MFC,谢谢!你先查询一下ok?
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 shellfish567 的回复:]
晕倒,这个你慢慢纠结吧,我是能不用api就不用api,自作孽啊!
[/Quote]

等到在工作中时,你自然知道写一个稳定的模块有多重要
shellfish567 2010-01-25
  • 打赏
  • 举报
回复
输入文件名?然后?里边还不是要open然后读出写入啥的,根本就没啥区别,好好的c标准库不用非得去找MFC里的api………………[Quote=引用 13 楼 jamesf1982 的回复:]
引用 12 楼 vincent_1011 的回复:
晕死,有API是运行期能跨平台的吗?

win下就是楼上上上上说的setendoffile.这已经是SDK了。
linux就不知道了


呵呵,可能我说的不正确,其实是自己搭建一个平台用于屏蔽windows和linux之间的差异。现在我的解决方法是用io打开文件,然后chsize来截断,不过一定得打开文件才行,很烦,想找找看windows有没有像linux那样直接根据文件名来裁剪的函数
[/Quote]
  • 打赏
  • 举报
回复
呃。。不懂帮顶!
shellfish567 2010-01-25
  • 打赏
  • 举报
回复
晕倒,这个你慢慢纠结吧,我是能不用api就不用api,自作孽啊!
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 vincent_1011 的回复:]
“其实是自己搭建一个平台用于屏蔽windows和linux之间的差异”

你这个东西也只是条件编译下实现的。不就是很常见的使用手法吗?说得那么复杂- -
[/Quote]

一点都不复杂。。。只不过我不了解windows的api,对我来说很复杂。。。
vincent_1011 2010-01-25
  • 打赏
  • 举报
回复
“其实是自己搭建一个平台用于屏蔽windows和linux之间的差异”

你这个东西也只是条件编译下实现的。不就是很常见的使用手法吗?说得那么复杂- -
james_hw 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vincent_1011 的回复:]
晕死,有API是运行期能跨平台的吗?

win下就是楼上上上上说的setendoffile.这已经是SDK了。
linux就不知道了
[/Quote]

呵呵,可能我说的不正确,其实是自己搭建一个平台用于屏蔽windows和linux之间的差异。现在我的解决方法是用io打开文件,然后chsize来截断,不过一定得打开文件才行,很烦,想找找看windows有没有像linux那样直接根据文件名来裁剪的函数
加载更多回复(8)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧