100分,我知道一个文件的Handle(就是用CreateFile返回的那个),我怎么知道这个文件的文件名?谢谢!(100分)

  • 主题发起人 主题发起人 Camel_bbs
  • 开始时间 开始时间
C

Camel_bbs

Unregistered / Unconfirmed
GUEST, unregistred user!
100分,我知道一个文件的Handle(就是用CreateFile返回的那个),我怎么知道这个文件的文件名?谢谢!
 
不会吧,没有人知道?大虾们,帮帮忙啊[:)]
 
答案是,根本就不可能,<br><br>既然你能用CreateFile打开文件,保留文件名到一变量就可以了<br>由猪得到猪肉容易,由猪肉得到一头猪可就难了
 
呵呵~,奇怪了,既然你都已经知道文件对应的Handle了,你怎么会不知道文件名呢?
 
我是也是的,那时MS一定在想,明明用一个文件名来得到一个Handle的,所以使用者<br>一定会知道这个文件名是什么,所以也就不用提供什么什么GetFileNameByHandle了,<br>但是现在确实有这方面的应用,我只知道别人给我的Handle,我现在想要知道这个<br>Handle所对应的文件名,其实WinAPI几乎所有的文件操作都是基于这个Handle的,<br>所以Windows一定知道这个文件在哪里,叫什么名字,不然怎么操作?我想这个地方<br>一定有,或者就是一个叫什么FileInformation的结构,但这个结构在哪里呢?和<br>Handle一定有关,但我不会,所以来这里提问了啦,呵呵,各位大虾要帮忙哦[:)]
 
winApi对文件的操作是通过Handle进行的,读写文件时你根本不用管文件名,如果你想把文件<br>的内容另外存盘,可以用新的文件名开一个handle,然后随便你操作了,如果只是想读文件<br>那没有必要知道文件名吧?
 
是的,我利用这个Handle的确可以对文件进行任何的读写操作,但是<br>我现在的需求是:我要知道那个文件名,是奇怪吧,有的场合也会用<br>到的。呵呵,谢谢关注!还有其它的回答吧。
 
也许您可以用DragQueryFile涵数试试.应该能返回文件名.
 
我也查找过这样的函数,<br>我在使用TFileStream时,有文件的句柄,<br>但是我想得到文件名,查了很多资料,和API函数<br>得出的结论是根本就不可能,因为没有这样的API函数<br><br>除非有未公开的方法和函数,劝楼主还是不要在这上面费劲了
 
下面是我在离线浏览器找到的.<br>uses <br>&nbsp; clipbrd, shellapi; <br><br>{$R *.DFM} <br><br>procedure TForm1.Button1Click(Sender: TObject); <br>var <br>&nbsp; f: THandle; <br>&nbsp; buffer: Array [0..MAX_PATH] of Char; <br>&nbsp; i, numFiles: Integer; <br>begin <br>&nbsp; Clipboard.Open; <br>&nbsp; try <br>&nbsp; &nbsp; f:= Clipboard.GetAsHandle( CF_HDROP ); <br>&nbsp; &nbsp; If f &lt;&gt; 0 Then Begin <br>&nbsp; &nbsp; &nbsp; numFiles := DragQueryFile( f, $FFFFFFFF, nil, 0 ); <br>&nbsp; &nbsp; &nbsp; memo1.Clear; <br>&nbsp; &nbsp; &nbsp; for i:= 0 to numfiles - 1 do begin <br>&nbsp; &nbsp; &nbsp; &nbsp; buffer[0] := #0; <br>&nbsp; &nbsp; &nbsp; &nbsp; DragQueryFile( f, i, buffer, sizeof(buffer)); <br>&nbsp; &nbsp; &nbsp; &nbsp; memo1.lines.add( buffer ); <br>&nbsp; &nbsp; &nbsp; end; <br>&nbsp; &nbsp; end; <br>&nbsp; finally <br>&nbsp; &nbsp; Clipboard.close; <br>&nbsp; end; <br>end;
 
劝楼主不要钻到牛角尖里去了,要不,到微软问问?呵呵
 
是啊,楼上说得有道理
 
多人接受答案了。
 
后退
顶部