如何获得资源管理器中的完整路径?

sczyq 2007-12-21 09:10:56
打开“我的电脑”窗口,进入N层目录,如果在“工具-文件夹选项-查看”下未设置“在标题栏显示完整路径”和“在地址栏显示完整路径”时,只显示当前文件夹名。

这个完整路径又如何获得呢?

...全文
601 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcfeng1982 2008-11-23
  • 打赏
  • 举报
回复
可是上面的代码只是找到所有的资源管理器的路径,并不知道要拖放到的是其中的哪个路径,如果要确定要拖放到的路径该如何做呢??
僵哥 2007-12-23
  • 打赏
  • 举报
回复
选中一个文件或者文件夹,然后右击->属性->常规->位置
Waiting4you 2007-12-23
  • 打赏
  • 举报
回复
向蒋晟大哥问个好先:-)

关于BCB里拖文件到资源管理器的方法可以参考偶的blog :-)
http://blog.csdn.net/Waiting4you/archive/2007/05/06/1597968.aspx
http://blog.csdn.net/Waiting4you/archive/2007/05/06/1597967.aspx
http://blog.csdn.net/Waiting4you/archive/2007/05/06/1597971.aspx
这个在MFC里倒是很方便。不知道为什么Borland没有提供IDataObject的实现。(也许我没发现)

另外楼主试试偶这段代码,它也可以得到完整路径,不过有个问题就是它显示的路径是用网页格式的,象file://...
    TCppShellWindows * pShellWin = new TCppShellWindows(this);

for(int i = 0; i < pShellWin->Count; i++){
IWebBrowser2Ptr pWebBrowser( pShellWin->Item(TVariant(i)));
if( pWebBrowser ){
WideString wsPath;
pWebBrowser->get_LocationURL(&wsPath);
OutputDebugStringW(wsPath);
}
}

delete pShellWin;
ccrun.com 2007-12-23
  • 打赏
  • 举报
回复
关注一下,没太明白楼主的意思呢.
Waiting4you 2007-12-23
  • 打赏
  • 举报
回复
pWebBrowser->LocationURL返回的BSTR好像是要用SysFreeString清除的。
sczyq 2007-12-23
  • 打赏
  • 举报
回复
对,就是网络文件存取,而不是本地。

Waiting4you 的办法不错,我只是修改了一下,采用 TShellWindows 类

这种办法比我那原来的方法好多了,基本能满足需要。

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit35.h"
#include <SHDocVw.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm35 *Form35;
//---------------------------------------------------------------------------
__fastcall TForm35::TForm35(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm35::Button1Click(TObject *Sender)
{
TShellWindows * pShellWin = new TShellWindows(this);

for(int i = 0; i < pShellWin->Count; i++)
{
IWebBrowser2 * pWebBrowser;
pShellWin->Item(i)->QueryInterface(IID_IWebBrowser2, (void **)&pWebBrowser);

if( pWebBrowser )
{
AnsiString S = pWebBrowser->LocationURL;
if (S.UpperCase().Pos("FILE:///") == 1)
{
S.Delete(1,8);
if (S.Pos("%"))
{
for (char C = 0x20; C < 0x7F; C++)
if (C != '%')
S = StringReplace(S, "%" + IntToHex(C, 2), C,
TReplaceFlags() << rfReplaceAll);
S = StringReplace(S, "%25", "%", TReplaceFlags() << rfReplaceAll);
}
S = StringReplace(S, "/", "\\", TReplaceFlags() << rfReplaceAll);
if (DirectoryExists(S))
Memo1->Lines->Add(S.c_str());
}
}
}
delete pShellWin;
}
//---------------------------------------------------------------------------
僵哥 2007-12-23
  • 打赏
  • 举报
回复
我这里只有Delphi的拖放例子:GWDrgDrp.zip,暂时只是随便看看,本来项目当中也需要做类似楼主所做的东西,因为关系到网络文件的存取,所以比较麻烦。
蒋晟 2007-12-23
  • 打赏
  • 举报
回复
下次提问的时候先说你要做什么
拖放文件到windows文件系统需要使用OLE接口。参考Handling Shell Data Transfer Scenarios。你的IDataObject实现应该以资源管理器支持的格式提供数据。
sczyq 2007-12-23
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM IParam)
{
char buffer[MAX_PATH];
GetWindowText(hwnd, buffer, MAX_PATH); // “在标题栏显示完整路径”时,取标题即可
if (DirectoryExists(buffer))
Form1->Memo1->Lines->Add(buffer);
return true;
}
//---------------------------------------------------------------------------


再运行 EnumWindows((WNDENUMPROC)EnumWindowsProc, NULL);
CACACACACA 2007-12-23
  • 打赏
  • 举报
回复
偶觉得是这个意思:

资源管理器打开了三个文件夹, 现在有用户要拖放文件到其中的一文件夹中. 楼主想知道这个文件夹的绝对路径.

看看ICopyHook; SHFileOperation

sczyq 2007-12-22
  • 打赏
  • 举报
回复
从窗口句柄中取,我是采用 EnumWindows 列出当前打开的所有窗口,再提取可能的路径。

目的是:处理拖放,可以拖放到哪些文件夹内,也就是当前资源管理器打开的文件夹窗口。

因为是虚拟拖放,所以不能按文件拖放来做,只能拖一个临时文件,并判断出拖到了哪里,当前打开的文件夹才是有可能拖入的。

如果选中了“在标题栏显示完整路径”,则已经处理得很好了,但在没选的情况下,不易得到完整路径。
蒋晟 2007-12-21
  • 打赏
  • 举报
回复
资源管理器可以有很多个窗口的,你的程序想获得哪个窗口的?
lihongbin33 2007-12-21
  • 打赏
  • 举报
回复
没看懂什么意思!!..

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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