C++ 如何处理无效的异常处理程序例程?
我正在建立一个程序,创建和删除目录。我使用MSVC编译器(Visual Studio 2017),这就是我不能分别使用“getcwd()”或“dirent.h”的原因。 我尝试了几种不同的方法来获取当前的工作目录,但总是出现问题。我设法用“_wgetcwd()”打印了cwd。然而,在我的研究中,我找不到如何将它的输出转换为在“\u rmdir()”或“\u wrmdir()”中使用它 我的主要目标是能够删除一个目录,而不必安装一些新的编译器。如果满足此条件,将非常感谢您的帮助,因为我已经尝试安装其他编译器,但没有成功。我还尝试了不同的方法来获取cwd并将其转换为所需的数据类型,但在我的IDE范围和我的基本知识中,没有任何方法起作用 我几乎是一个编程初学者,我正在学习这本书,不幸的是它使用了“dirent.h”。下面是我当前代码的一个片段,我已经消除了所有错误。然而,我还是遇到了最后一个恼人的例外:C++ 如何处理无效的异常处理程序例程?,c++,exception,visual-c++,C++,Exception,Visual C++,我正在建立一个程序,创建和删除目录。我使用MSVC编译器(Visual Studio 2017),这就是我不能分别使用“getcwd()”或“dirent.h”的原因。 我尝试了几种不同的方法来获取当前的工作目录,但总是出现问题。我设法用“_wgetcwd()”打印了cwd。然而,在我的研究中,我找不到如何将它的输出转换为在“\u rmdir()”或“\u wrmdir()”中使用它 我的主要目标是能够删除一个目录,而不必安装一些新的编译器。如果满足此条件,将非常感谢您的帮助,因为我已经尝试安装
#include <iostream>
#include <stdlib.h>
#include<string>
#include <direct.h>
int main() {
int t = 0;
std::string str;
char xy = ' ';
char* _DstBuf = &xy;
const char* uniquename;
uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
std::cout << "Current path is ";
while (*uniquename != '\0') // this pointer points to the beginning of my path
{
std::cout << char(*uniquename); // prints one char of the path name for each iteration
char var = char(*uniquename);
str.push_back(var); //here the exception below is thrown.
// jump to the next block of memory
uniquename++;
}
std::cout << str <<'\n';
const char* lastchance = str.c_str();
if (_wchdir('..')) {
std::cout << "changing directory failed.\n";
}
if (_rmdir(lastchance) == -1 && errno == ENOTEMPTY) {
std::cout << "Given path is not a directory, the directory is not empty, or the directory is either the current working directory or the root directory.\n";
}
else if (_rmdir(lastchance) == -1 && errno == ENOENT)
{
std::cout << "Path is invalid.\n";
}
else if (_rmdir(lastchance) == -1 && errno == EACCES)
{
std::cout << "A program has an open handle to the directory.\n";
}
else if (_rmdir(lastchance)) {
std::cout << "removing directory still not possible\n";
}
#包括
#包括
#包括
#包括
int main(){
int t=0;
std::字符串str;
char xy='';
char*DstBuf=&xy;
常量字符*唯一名称;
uniquename=_getdcwd(0,DstBuf,_MAX_路径);
Std::CUT所以如果你打算用C风格编程(即使你有C++编译器),你也必须学习数组和指针是如何工作的。它是“强”>远/强〉,要从因特网上学习太大的主题,你需要一个.<
不过,我会指出一些错误
char xy = ' ';
char* _DstBuf = &xy;
const char* uniquename;
uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
这是完全错误的。它可以编译,但这并不意味着它可以工作。这是必需的
char DstBuf[_MAX_PATH];
_getdcwd(0, DstBuf, _MAX_PATH);
_getdcwd需要一个作为指针传递的数组(请参阅,您需要了解数组和指针)
然后,您尝试打印结果并将结果分配给字符串。同样,代码比需要的复杂得多。下面是更简单的版本
std::string str = DstBuf;
std::cout << str <<'\n';
然后您尝试删除一个目录四次,很明显,删除一个目录不能超过一次
等等。您的代码有几个问题。我认为您的异常是由这行代码引起的:
uniquename=_getdcwd(0,DstBuf,_MAX_路径);
它调用\u getdcwd
并向其传递一个指向单个字符的指针,同时还指定指针最多可容纳\u MAX\u PATH
。这是完全未定义的行为
修复这个问题,我认为你应该完全改变你正在做的事情。除了C++之类的分散的C++部分,你的代码读起来像是代码:STS::String 。因为C++ 17标准库支持内置的文件系统操作。因此,你可以用<代码> STD::文件系统< /代码>更简洁地重写代码。而且是安全的
../get path删除并存储在del_path中(del_path应该是std::filesystem::path对象)
std::filesystem::remove_目录(del_路径);//递归删除del_路径指定的目录
...
注意:std::filesystem::remove_目录
如果失败,将抛出std::filesystem::filesystem_错误
您可以使用std::filesystem
通过std::filesystem::current_path
获取当前目录
我也建议在C++上选择一个,因为这似乎并没有教你好的实践< /P>你是如何得出结论的?<代码> GETCWD()/<代码>是不是超出了你的范围,用那个编译器?那似乎不太可能。什么行引起异常,在什么条件下?(0,_DstBuf,_MAX_路径);
正在尝试将CWD的名称加载到单个字符变量xy
。请参阅:char*\u DstBuf=&xy;
您对\u getdcwd
的参数不正确。您正在向单个字符传递指针,但告诉函数它最多可以在那里存储260个字符。一旦完成,所有赌注都将被取消接下来会发生什么。您可以传递NULL作为缓冲区参数,让它为您分配内存,或者传递已分配的大小适当的数组或内存块的地址。@nicomp:有一条注释,其中,异常会在代码示例中抛出。非常感谢!文件系统使它变得更容易了!
if (_chdir("..")) {
std::cout << "changing directory failed.\n";
}