求助:U盘读写~~ ( 积分: 119 )

  • 主题发起人 主题发起人 ydzi_
  • 开始时间 开始时间
Y

ydzi_

Unregistered / Unconfirmed
GUEST, unregistred user!
请问,如何把USB接口的CF卡当作一个文件来读写(每字节)!!

谢谢
 
直接扇区读写就行了。
 
是啊!
用CreateFile即可!
 
我在网上和大富翁找不到相关的资料,晕
 
拜托大侠提供些相关资料,谢谢
 
h为U盘:

var
buf:packed array [0..1024] of char;
_Hd:THandle;

begin
_Hd := CreateFile('//./H:',GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
Snum=1个U盘扇区的大小字节!
readfile(_Hd,pchar(buf),Snum); // 最好只读写1个扇区!重要!
。。。 。。。
end;
供你参考!
 
谢谢提供
 
for I := 1 to Length(edit1.Text) do
buf := edit1.Text;

_hd := createFile('//./J:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

WriteFile(_hd, buf, 1, lwritten, nil);
closehandle(_hd);


为什么没有把数据写进去呢??

谢谢
 
_hd := createFile('//./J:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

改成
_hd := createFile('//./J:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, 0);

试试。

另外,closehandle前调用一下
BOOL FlushFileBuffers(
HANDLE hFile // open handle to file whose buffers are to be
// flushed
);
确保把缓存的内容写入磁盘。
 
谢谢 crazycock

不过数据还是没进去!

硬件:USB口的CF卡512M!

继续
 
_hd的句柄是否正确获取?另外获取一下WriteFile的返回值,看看是否成功写入。代码没啥问题,关键看哪一步失败了。可以先找个U盘试验一下这份代码。
 
_hd 的值 3964

WriteFile 返回 FALSE

 
哪位朋友有相关资料可供参考一下,谢谢!
 
我也试了,错误码87,查MSDN是参数错误的意思,不直到为啥。还有其他人也遇到过。咨询了一下同事,也没弄明白原因。我要读写设备的时候,一般是打开设备句柄后,用SCSI命令$2A、$28来实现扇区读写的,那种方法是没问题的。
 
对SCSI命令不是很了解!

谢谢crazycock!!

难道没有办法了吗??
 
我发现问题了。
参考这篇文章:
http://www.osronline.com/lists_archive/ntfsd/thread2680.html

原因就如文章里面提到的,操作一个volume的时候,你的操作尺寸必须是512的倍数。

这里也有一个人遇到了这个问题,自己解决了,但是没说原因,鄙视一下。
http://www.programfan.com/club/showpost.asp?id=8516
 
问题似乎已经找到!

MSDN:
文件的存取开头的字节偏移量必须是扇区尺寸的整倍数.

文件存取的字节数必须是扇区尺寸的整倍数.例如,如果扇区尺寸是512字节程序就可以读或者写512,1024或者2048字节,但不能够是335,981或者7171字节.

进行读和写操作的地址必须在扇区的对齐位置,在内存中对齐的地址是扇区尺寸的整倍数.

寻找答案中。。。
 
还在寻求答案?不是已经找到问题所在了么?

buf:array [0..512] of byte;


for I := 1 to Length(edit1.Text) do
buf := edit1.Text;

_hd := createFile('//./J:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

WriteFile(_hd, buf, 512, lwritten, nil);//这里要用512,lwritten设为1即可操作一个扇区。
closehandle(_hd);
 
-_-!!

我试过了!
U盘格式为FAT!

执行完上述代码后,U盘属性如下:

已用空间: 0字节
可用空间: 0字节

容量: 0字节

而且这一句:buf := edit1.Text; 会出错!
 
“把USB接口的CF卡当作一个文件来读写”这意思就是要直接读写扇区啰!参考: http://dev.csdn.net/develop/article/20/20550.shtm
 
后退
顶部