user-0 提问: 在vc环境下,用dir命令后，显示的文件目录,怎么保存?保存到字符串中还是什么?以及怎么保存

回复:
user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-2
content: #include<stdio.h> #include<string.h> // 运行的时候不要加参数 int main(int argc,char** argv) { 	if(1==argc) // 无参数时 		system("dir /b | t.exe d"); // 这里的t.exe为此程序名，后加参数d。使用管道符号“|”后，dir的标准输出会作为t.exe的标准输入 	else if(2==argc) 	{ 		if(!strcmp(argv[1],"d")) // 有参数d时 		{ 			char filename[260]; 			int i=0; 			while(gets(filename)) // 用gets得到dir的每一行输出 				printf("%d:%s\n",++i,filename); 		} 	} 	return 0; }

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-1
content: 使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。

user: user-1
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

user: user-2
content: 引用 6 楼 u010933820 的回复:[quote=引用 1 楼 user-2 的回复:]  #include<stdio.h> #include<string.h> // 运行的时候不要加参数 int main(int argc,char** argv) { 	if(1==argc) // 无参数时 		system("dir /b | t.exe d"); // 这里的t.exe为此程序名，后加参数d。使用管道符号“|”后，dir的标准输出会作为t.exe的标准输入 	else if(2==argc) 	{ 		if(!strcmp(argv[1],"d")) // 有参数d时 		{ 			char filename[260]; 			int i=0; 			while(gets(filename)) // 用gets得到dir的每一行输出 				printf("%d:%s\n",++i,filename); 		} 	} 	return 0; }  非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做[/quote] 如果只是保存目录的话建议你直接在cmd里输入 dir > x.txt 就可以保存到x.txt这个文本文件里。 > 是一种重定向符号，表示将其左侧命令的输出保存到右侧的文件或设备里，具体看3楼就可以了。  argc、argv与命令行参数有关，比如直接在cmd里输入“dir”得到的是你图片里的内容，如果输入“dir /b”，输出就只有文件名了，输入“dir /?”可以查看dir的帮助信息，这里的/b、/?都是命令行参数，它们加在程序名之后，用空格与程序名分开。 1==argc表示没有命令行参数，就像直接输入“dir”一样。 2==argc表示有一个命令行参数，输入“dir /?”一样。 if(!strcmp(argv[1],"d")) 表示这个命令行参数是“d” system("dir /b | t.exe d");，system是调用系统命令，与在cmd里直接输入命令的效果一样。“|”是管道符，表示前者的输出作为后者的输入，详细解释见3楼。

user: user-0
content: 引用 1 楼 user-2 的回复: #include<stdio.h> #include<string.h> // 运行的时候不要加参数 int main(int argc,char** argv) { 	if(1==argc) // 无参数时 		system("dir /b | t.exe d"); // 这里的t.exe为此程序名，后加参数d。使用管道符号“|”后，dir的标准输出会作为t.exe的标准输入 	else if(2==argc) 	{ 		if(!strcmp(argv[1],"d")) // 有参数d时 		{ 			char filename[260]; 			int i=0; 			while(gets(filename)) // 用gets得到dir的每一行输出 				printf("%d:%s\n",++i,filename); 		} 	} 	return 0; }  非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做

user: user-0
content: 引用 楼主 u010933820 的回复:有代码例子更好，没有的话请讲一下思路，步骤什么的（我是编程白痴。。。） 非常感谢你的回答！！太感谢了！ 可是我太笨，没看懂●rz 那个，if(1==argc)是什么意思？2==argc呢？运行不加参数是什么意思 还有这个是什么功能system("dir /b | t.exe d"); 我想把如下图的目录存起来，请问怎么做