怎样获取命令行参数等2个问题。。。

时间:2022-03-07 14:28:33
我想写一个程序,安装到“发送到”的子菜单中,希望能实现以下功能:

1。选择一批文件、文件夹后,发送到此程序中,程序能指定发送到的目录。
2。程序运行时,可用拖放的方式实现文件及文件夹的发送。

问题:

1。怎样获取里面发送过来的文件及文件夹列表,命令行长度是否可无限制。
2。怎样复制或移动文件夹。

35 个解决方案

#1


1、命令行长度好象是不能超过255个字符吧。
2、拷贝整个目录:
TSHFileOpStruct OpStruct;
char From="c:\\tmp";
char To="d:\\tmp";

   // 设置OpStruct
   OpStruct.hwnd = Handle;
   OpStruct.wFunc = FO_COPY;
   OpStruct.pFrom =  From;
   OpStruct.pTo = To;
   OpStruct.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION;
   OpStruct.fAnyOperationsAborted =  False;
   OpStruct.hNameMappings = NULL;
   OpStruct.lpszProgressTitle = NULL;

   if(  SHFileOperation( &OpStruct )==0 )
   MessageBox(Handle, "复制完毕。", "信息", MB_OK|MB_ICONINFORMATION);

移动的函数可以参考上面的例子。

#2


得到命令行参数见
http://www.csdn.net/expert/topic/145/145388.shtm
不过不知道你在这里如何利用

#3


可能是我问得不准确。

各位,看看我的问题内容,该怎样实现呢?

#4


有一个类似的软件,叫发送通,不过很烂,批量文件只能处理前面一个。

#5


这里这么多人,有没有人会?

#6


?

#7


第二种比较简单。第一种我也不会。

#8


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command , int)

其中的command 就是命令行参数。

#9


似乎不行:

命令行参数长度有限,我想发送1000000个文件到我的程序再由它处理怎么办?

#10


有人知道吗?

#11


搞什么嘛,虽是我不喜欢 automation 但这种情况也管不了那么多了,建立个 COM 对像!

#12


怎么做?

#13


再来。

#14


在FormCreate中可以如下取到参数

  for (int i=0;i<=ParamCount();i++)
  {
     ParamStr(i)            //你需要运用的参数。
  }

#15


cgzhao(照仔)

命令行长度有限,不行。

#16


有高手没有?

#17


那你该生成一个文件列表快照了

然后一个一个的发过去


你在考验命令行极限呀

改变思路吧

@_@

#18


我的意思这样:

你可以选一堆东西,发送到软盘、我的文档等处,是系统实现的吧。
如果我的程序要实现同样的功能,可以么?

#19


  你可以用下面的两种不同的技巧来解决这个问题。

  技巧1:首先,也许是最简单的方法是调用VCL 
ParaStr()函数。你可使用ParamCount()函数来确定到底有多少个命令行参数传递给了应用程序。

  ParamStr需要一个整数参数并且返回一个AnsiString对象。若参数为0, ParamStr 
将返回可执行文件的全称路径。若参数为1,将返回程序名及第一个命令行参数。若参数为2,将返回第二个参数,等等。

  作为一个实践,开启一个新的项目,在主窗口上放置5个Label,将下面的代码添加到窗口的构造函数中:  Label1->Caption = ParamStr(0);
  Label2->Caption = ParamStr(1);
  Label3->Caption = ParamStr(2);
  Label4->Caption = ParamStr(3);
  Label5->Caption = ParamStr(4);

  再运行程序。一般应能看到类似字符串:  E:\CBUILDER\PROJECTS\PROJECT1.EXE

  如果没传递参数到程序,那么Label2到Label5是空字符串。关闭程序,从C++Builder菜单中选择 Run | 
Parameters。输入几个参数(-debug -testing 
-param)再次运行程序。你将看到:  E:\CBUILDER\PROJECTS\PROJECT1.EXE
  -debug
  -testing
  -param

  提示: ParamStr 
对目录中的空格能智能判断。为证实这点,把生成的EXE文件拷贝到Program 
Files目录下再运行它,你将会看到ParamStr(0)返回全路径,并包含空格。

  技巧2:第二个方法就是调用GetCommandLine 
API函数。GetCommandLine不需要参数,并且返回一个C风格的char 
*,包含全部的命令行参数。你将不得不分解字符串以取得相关参数。  

#20


ok 赶快结贴吧。

#21


luhongjun(过江项羽) 

我试了一下,发送菜单中的确传递了命令行过来。不过当选择的文件较多时(有时较少但有目录时也会)会提示“指定的设备无法读取”。所以用命令行的方法不能解决我的问题,它的长度是有限的。

那么发送到软驱这样的操作是怎样实现的呢?

#22


???

#23


up

#24


这个问题怎么冒上来了???还没有解决??????赶快结束本贴,然后有问题重新开。太9太9前的问题了。

┏━┯━┓
┃竹  副┃
┠TR@SOE┨
┃印  斑┃
┗━┷━┛

#25


To TR@SOE:

请先别忙着删我。您看一下题目要求,就会知道上面的答案并没有解决问题!
难道CSDN不是解决问题的地方吗?


1。选择一批文件、文件夹后,发送到此程序中,程序能指定发送到的目录。
2。程序运行时,可用拖放的方式实现文件及文件夹的发送。

问题:

1。怎样获取里面发送过来的文件及文件夹列表,命令行长度是否可无限制。
2。怎样复制或移动文件夹。


其实我的要求可以简述为:

怎样像接收用鼠标拖过来的所有可拖的东西,文件、文件夹、桌面图标。。。。


如果现在就结贴,只能说明 C++ Builder 版本没人能解决这个问题,如果真是这样,结也无所谓了。

#26


这里至少有两个问题需要澄清:

一、首先不是所有的问题都是可以解决的。非技术类的问题更是如此。但是也不是所有技术问题都可能得到解决。从一个侧面来说,确实说明BCB目前能解决这样问题的高手还不多(甚至没有);但是如果综合其他其他栏目,BCB的问题解决率如果不是高出很多,至少是不是持平。你这样一来,把大家的水平都给贬下去了。

二、更重要的,你自己在这两个多月中干了些什么呢?是消极地等待答案从天而降?还是试试大家的方法(不管对错),同时自己不断地学习以获得新的进步?两个多月过去了,你的问题主体还没有变,只能说明你只是消极地在等待(如果我讲错了,并且你可以证明你有了一些实质的进展,那我愿意道歉)。

#27


To TR@SOE():

斑竹教训得是,到目前为止,对于这个问题,我作成了如下进度:

1。可以实现文件、文件的拖入。但“我的电脑”这样的桌面系统图标无法接收到。
2。把程序加到了“发送到”菜单中,但能接收到的命令行字数有限。如果我选1000个文件再发送过来,从命令行就收不到了。

而实际情况是,许多程序都已解决了问题 2,比如“发送到”菜单中的软驱、EDITPLUS 等。

如果说二月来我没有用过心,那是你的偏见。我并非职业程序员,所以不可能每天只作编程的事情,况且水平又不高,所以等待是必然的。除非CSDN不接受非程序员的问题。

不管怎么说,我还是希望我的问题能有人答得出。同时感谢和们的关心,也感谢 TR@SOE 的批评,“忠言逆耳利于行”,我会记住的。




#28


可能我的话有点偏激,向你表示歉意。我本身就是业余选手,所以…………

#29


to TR@SOE
char From="c:\\tmp";
是你的笔误吧

#30


笔误?INDSP()兄有何高见?TR@SOE 这里有什么不对吗?
千万别告诉我应该是 "c:\tmp" !!

#31


是有笔误,应该是:
char* From="c:\\tmp";
char* To="d:\\tmp";

呵呵。

#32


这个问题在c++Builder 5编程实例与技巧里有的,自己去看看吧

#33


Zibao(Zibao):我实现这种功能都是通过鼠标拖放,你所说的EditPlus我试了也并不能接受很多的文件和目录,具体数目没数,不过不算多。

我有一个程序是演示如何接受播放文件及目录,多少个都可以。需要的话我可以发给你。

#34


To SCUM(人渣):
谢谢,我想看看你的程序。我的mail:zibao99@263.net
另外,请再帮我想想我的问题(关于“发送到”菜单项)的解决方法,谢了!

#1


1、命令行长度好象是不能超过255个字符吧。
2、拷贝整个目录:
TSHFileOpStruct OpStruct;
char From="c:\\tmp";
char To="d:\\tmp";

   // 设置OpStruct
   OpStruct.hwnd = Handle;
   OpStruct.wFunc = FO_COPY;
   OpStruct.pFrom =  From;
   OpStruct.pTo = To;
   OpStruct.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION;
   OpStruct.fAnyOperationsAborted =  False;
   OpStruct.hNameMappings = NULL;
   OpStruct.lpszProgressTitle = NULL;

   if(  SHFileOperation( &OpStruct )==0 )
   MessageBox(Handle, "复制完毕。", "信息", MB_OK|MB_ICONINFORMATION);

移动的函数可以参考上面的例子。

#2


得到命令行参数见
http://www.csdn.net/expert/topic/145/145388.shtm
不过不知道你在这里如何利用

#3


可能是我问得不准确。

各位,看看我的问题内容,该怎样实现呢?

#4


有一个类似的软件,叫发送通,不过很烂,批量文件只能处理前面一个。

#5


这里这么多人,有没有人会?

#6


?

#7


第二种比较简单。第一种我也不会。

#8


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR command , int)

其中的command 就是命令行参数。

#9


似乎不行:

命令行参数长度有限,我想发送1000000个文件到我的程序再由它处理怎么办?

#10


有人知道吗?

#11


搞什么嘛,虽是我不喜欢 automation 但这种情况也管不了那么多了,建立个 COM 对像!

#12


怎么做?

#13


再来。

#14


在FormCreate中可以如下取到参数

  for (int i=0;i<=ParamCount();i++)
  {
     ParamStr(i)            //你需要运用的参数。
  }

#15


cgzhao(照仔)

命令行长度有限,不行。

#16


有高手没有?

#17


那你该生成一个文件列表快照了

然后一个一个的发过去


你在考验命令行极限呀

改变思路吧

@_@

#18


我的意思这样:

你可以选一堆东西,发送到软盘、我的文档等处,是系统实现的吧。
如果我的程序要实现同样的功能,可以么?

#19


  你可以用下面的两种不同的技巧来解决这个问题。

  技巧1:首先,也许是最简单的方法是调用VCL 
ParaStr()函数。你可使用ParamCount()函数来确定到底有多少个命令行参数传递给了应用程序。

  ParamStr需要一个整数参数并且返回一个AnsiString对象。若参数为0, ParamStr 
将返回可执行文件的全称路径。若参数为1,将返回程序名及第一个命令行参数。若参数为2,将返回第二个参数,等等。

  作为一个实践,开启一个新的项目,在主窗口上放置5个Label,将下面的代码添加到窗口的构造函数中:  Label1->Caption = ParamStr(0);
  Label2->Caption = ParamStr(1);
  Label3->Caption = ParamStr(2);
  Label4->Caption = ParamStr(3);
  Label5->Caption = ParamStr(4);

  再运行程序。一般应能看到类似字符串:  E:\CBUILDER\PROJECTS\PROJECT1.EXE

  如果没传递参数到程序,那么Label2到Label5是空字符串。关闭程序,从C++Builder菜单中选择 Run | 
Parameters。输入几个参数(-debug -testing 
-param)再次运行程序。你将看到:  E:\CBUILDER\PROJECTS\PROJECT1.EXE
  -debug
  -testing
  -param

  提示: ParamStr 
对目录中的空格能智能判断。为证实这点,把生成的EXE文件拷贝到Program 
Files目录下再运行它,你将会看到ParamStr(0)返回全路径,并包含空格。

  技巧2:第二个方法就是调用GetCommandLine 
API函数。GetCommandLine不需要参数,并且返回一个C风格的char 
*,包含全部的命令行参数。你将不得不分解字符串以取得相关参数。  

#20


ok 赶快结贴吧。

#21


luhongjun(过江项羽) 

我试了一下,发送菜单中的确传递了命令行过来。不过当选择的文件较多时(有时较少但有目录时也会)会提示“指定的设备无法读取”。所以用命令行的方法不能解决我的问题,它的长度是有限的。

那么发送到软驱这样的操作是怎样实现的呢?

#22


???

#23


up

#24


这个问题怎么冒上来了???还没有解决??????赶快结束本贴,然后有问题重新开。太9太9前的问题了。

┏━┯━┓
┃竹  副┃
┠TR@SOE┨
┃印  斑┃
┗━┷━┛

#25


To TR@SOE:

请先别忙着删我。您看一下题目要求,就会知道上面的答案并没有解决问题!
难道CSDN不是解决问题的地方吗?


1。选择一批文件、文件夹后,发送到此程序中,程序能指定发送到的目录。
2。程序运行时,可用拖放的方式实现文件及文件夹的发送。

问题:

1。怎样获取里面发送过来的文件及文件夹列表,命令行长度是否可无限制。
2。怎样复制或移动文件夹。


其实我的要求可以简述为:

怎样像接收用鼠标拖过来的所有可拖的东西,文件、文件夹、桌面图标。。。。


如果现在就结贴,只能说明 C++ Builder 版本没人能解决这个问题,如果真是这样,结也无所谓了。

#26


这里至少有两个问题需要澄清:

一、首先不是所有的问题都是可以解决的。非技术类的问题更是如此。但是也不是所有技术问题都可能得到解决。从一个侧面来说,确实说明BCB目前能解决这样问题的高手还不多(甚至没有);但是如果综合其他其他栏目,BCB的问题解决率如果不是高出很多,至少是不是持平。你这样一来,把大家的水平都给贬下去了。

二、更重要的,你自己在这两个多月中干了些什么呢?是消极地等待答案从天而降?还是试试大家的方法(不管对错),同时自己不断地学习以获得新的进步?两个多月过去了,你的问题主体还没有变,只能说明你只是消极地在等待(如果我讲错了,并且你可以证明你有了一些实质的进展,那我愿意道歉)。

#27


To TR@SOE():

斑竹教训得是,到目前为止,对于这个问题,我作成了如下进度:

1。可以实现文件、文件的拖入。但“我的电脑”这样的桌面系统图标无法接收到。
2。把程序加到了“发送到”菜单中,但能接收到的命令行字数有限。如果我选1000个文件再发送过来,从命令行就收不到了。

而实际情况是,许多程序都已解决了问题 2,比如“发送到”菜单中的软驱、EDITPLUS 等。

如果说二月来我没有用过心,那是你的偏见。我并非职业程序员,所以不可能每天只作编程的事情,况且水平又不高,所以等待是必然的。除非CSDN不接受非程序员的问题。

不管怎么说,我还是希望我的问题能有人答得出。同时感谢和们的关心,也感谢 TR@SOE 的批评,“忠言逆耳利于行”,我会记住的。




#28


可能我的话有点偏激,向你表示歉意。我本身就是业余选手,所以…………

#29


to TR@SOE
char From="c:\\tmp";
是你的笔误吧

#30


笔误?INDSP()兄有何高见?TR@SOE 这里有什么不对吗?
千万别告诉我应该是 "c:\tmp" !!

#31


是有笔误,应该是:
char* From="c:\\tmp";
char* To="d:\\tmp";

呵呵。

#32


这个问题在c++Builder 5编程实例与技巧里有的,自己去看看吧

#33


Zibao(Zibao):我实现这种功能都是通过鼠标拖放,你所说的EditPlus我试了也并不能接受很多的文件和目录,具体数目没数,不过不算多。

我有一个程序是演示如何接受播放文件及目录,多少个都可以。需要的话我可以发给你。

#34


To SCUM(人渣):
谢谢,我想看看你的程序。我的mail:zibao99@263.net
另外,请再帮我想想我的问题(关于“发送到”菜单项)的解决方法,谢了!