2013-07-09 89 views
2

我在python中编写了一个程序,它具有能够找出文件大小,创建目录和移动的功能,就好像我只是在一个普通的shell中一样。 porblem是我需要能够在C++中做到这一点。从C++运行一些命令行命令

这里有我需要从C++功能的Python代码:

os.chdir('r'+str(r)+'n'+str(n)) 
def build_path(newpath): 
    if os.path.isdir(newpath): 
     os.chdir(newpath) 
    else: 
     os.mkdir(newpath) 
     os.chdir(newpath) 

而且还这片:

if os.stat('data'+str(tick)).st_size > 2500000: 
    heavyFile.close() 
    tick+=1 
    heavyFile=open('data'+str(tick),'w') 
os.system('touch COMPLETED'+str(r)+str(n)) 

所以基本上我需要能够做出一些目录,变成这些目录,构建文件,但不要让它们大于2.5 MB,并且当它们最终超过这个大小时,创建一个增加1的新文件。

所以文件树最终看起来像:

r4n4/DIR1/DATA0,DATA1,DATA2等 r4n4/DIR2/DATA0,DATA1,DATA2等 等。

我该如何在C++中做到这一点?我知道我可以调用系统('命令') ,但我不知道如何很好地使用它来获取文件大小,我只是希望有一个更简单的方法来做到这一点。 此外,我无法提升我在运行此程序的位置。

+0

基本上你问这里是如何操作和由C查询文件系统++,并不见得运行命令行命令C++,尽管我可以理解你的思路来获得你当前的头衔。我会建议改变你的头衔。 –

回答

1

您可以使用stat()在你的代码来获取文件系统对象的属性。这里有一个例子:

#include <sys/types.h> 
#include <sys/stat.h> 

struct stat buf; 
stat(filename, &buf); 

// If it's a regular file, print the size in bytes 
if ((buf.st_mode & S_IFREG) == S_IFREG) 
{ 
    off_t size = buf.st_size; 
    fprintf(stdout, "%s is a regular file\n", filename); 
    fprintf(stdout, "%s is a regular file: size %zd bytes\n", filename, size); 
} 

范围内也stat.h宏,这使得它更容易一些检查,如果事情是一个普通文件或什么的,而不是AND'ing的许多东西如上。例如,S_ISREG宏将做同样的事情,上面的代码:

if(S_ISREG(buf.st_mode)) /* stat.h macro, instead of AND'ing */ 
{ 
    fprintf(stdout, "%s is a regular file\n", filename); 
} 

S_ISDIR会告诉你,如果它是一个目录。还有像这样的其他宏。

您可以通过man -s 2 stat查看stat()的手册页并获取更多详细信息。希望这可以帮助。

1

你可以利用系统调用来实现你想要的。如果你是在Linux上,请查看以下手册页:

man 2 chdir 
man 2 mkdir 
man 2 stat 
+0

你如何从stat恢复输出到你的程序? – KevinShaffer

+0

'stat(2)'的输出将位于参数'struct stat * buf'中,该参数是'stat'的第二个参数。你会把它传递给'stat'。 – unxnut

1

用户也可以直接从C调用脚本++代码使用此命令:

system ("python script.py");