簡體   English   中英

如何處理無效的異常處理程序例程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM