[英]how can i handle an invalid exception handler routine?
我正在構建一個程序,它創建和刪除目錄。 我使用 MSVC 編譯器(Visual Studio 2017),這就是我不能分別使用“getcwd()”或“dirent.h”的原因。 我嘗試了幾種不同的方法來獲取當前的工作目錄,但總是有問題。 我設法用“_wgetcwd()”打印了 cwd。 但是,在我的研究中,我找不到如何將其轉換為 output 以在“_rmdir()”或“_wrmdir()”中使用它。
我的主要目標是能夠刪除目錄而無需安裝一些新的編譯器。 如果滿足這個條件,任何幫助表示贊賞,因為我已經嘗試安裝不同的編譯器,但我沒有讓它工作。 我還嘗試了不同的方法來獲取 cwd 並將其轉換為所需的數據類型,但我的 IDE 的 scope 和我的基本知識都沒有任何效果。
我幾乎是編程的初學者,我正在學習這本書,不幸的是使用了“dirent.h”。 以下是我當前代碼的片段,其中我已經消除了所有錯誤。 但是我仍然得到最后一個煩人的異常:
#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";
}
}
這是我得到的異常: Experimentfile.exe 中 0x6E656D69 處的未處理異常:0xC00001A5:檢測到無效異常處理程序例程(參數:0x00000003)。
因此,如果您要以 C 樣式進行編程(即使您有 C++ 編譯器),您將必須了解 arrays 和指針是如何工作的。 從互聯網上學習的話題太大了,您需要一本好書。
但是我會指出一些錯誤
char xy = ' ';
char* _DstBuf = &xy;
const char* uniquename;
uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
這簡直是大錯特錯。 它可以編譯,但這並不意味着它會起作用。 這是需要的
char DstBuf[_MAX_PATH];
_getdcwd(0, DstBuf, _MAX_PATH);
_getdcwd 需要一個作為指針傳遞的數組(請參閱,您需要了解 arrays 和指針)。
然后您嘗試打印出結果並將結果分配給一個字符串。 同樣,代碼比它需要的復雜得多。 這是更簡單的版本
std::string str = DstBuf;
std::cout << str <<'\n';
然后您嘗試更改目錄。 我不知道為什么當您有窄字符串時使用寬版本_wchdir
,請改用_chdir
。 再次參數不正確, '..'
是一個多字符文字,但_chdir
需要一個 C 字符串。 這是使用_chdir
的正確版本。
if (_chdir("..")) {
std::cout << "changing directory failed.\n";
}
然后你嘗試刪除一個目錄四次,顯然你不能多次刪除一個目錄。
等等等等。
您的代碼有幾個問題。 我認為您的異常是由這一行引起的:
uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
它正在調用_getdcwd
並將其傳遞給單個字符的指針,同時還指定該指針最多可以容納_MAX_PATH
。 這是完全未定義的行為。
要解決這個問題,我認為你應該完全改變你正在做的事情。 您的代碼讀起來像 C 代碼,除了像std::string
這樣分散的 C++ 部分。 由於 C++17 標准庫支持內置的文件系統操作。因此,您可以使用std::filesystem
以更簡潔和安全的方式重寫代碼。
... // get path to delete and store it in del_path (del_path should be an std::filesystem::path object)
std::filesystem::remove_directories(del_path); // Recursive delete the directory specified by del_path
...
注意:如果std::filesystem::remove_directories
失敗,它將拋出一個std::filesystem::filesystem_error
。
您可以通過std::filesystem::current_path
使用std::filesystem
獲取當前目錄。
我還建議選擇一本關於 C++ 的更好的書,因為這本書似乎沒有教你好的做法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.