簡體   English   中英

成功創建目錄后,為什么wxMkDir返回0?

[英]Why does wxMkDir return 0 when successfully creating a directory?

因此,我必須預先承認我已經知道答案了。 我要問的是,碰巧遇到相同問題的其他人可以找到解決方法,以解決由於文檔不正確而導致的問題。

我的環境是在Windows 7上開發的VS 2015 C ++,wxWidgets 3.0.2。

在某些舊版代碼中,未檢查對wxMkDir的調用是否成功。 根據wxWidgets文檔 ,wxMkDir具有布爾類型的返回類型,如果成功,則返回true。 但是,成功時返回0。

為什么?

答案有兩個:有兩個名稱相似的函數wxMkdir和wxMkDir ,前者已記錄在案,而后者未記錄在案。 第二部分是它們將表現相同的看似有效的假設不是有效的假設。

未記錄的函數wxMkDir映射到wxCRT_MkDir,后者又映射到wxCRT_MkDirA,然后映射到wxPOSIX_IDENT(mkdir),后者為所提到的POSIX函數mkdir創建一個依賴於平台的名稱。 根據POSIX文檔的mkdir

成功完成后,mkdir()將返回0。否則,將返回-1,不創建任何目錄,並且應設置errno來指示錯誤。

因此,條件如下:

if (!wxMkDir(newDir)) {
  // handle the error here
}

將失敗,但是:

if (wxMkDir(newDir) != 0) {
  // handle the error here
}

根據目錄是否已創建,將按預期工作。

已記錄的函數wxMkdir是在wx源文件filefn.cpp中實現的,並使用mkdir,但具有上述條件,可以映射到適當的bool返回值。

wxMkdir()wxMkDir()是wxWidgets為所有標准提供wxFoo()包裝器的通用規則的不幸和丑陋的例外(這意味着ANSI C或POSIX實際上是后者的標准配置,並且比C99更標准) )函數foo()存在於窄版( char* )和寬版( wchar_t* )中。

因此,根據該一般規則,您希望wxMkdir()的行為與std::mkdir()但不幸的是, wxMkdir()早於wxWidgets的Unicode化,所以該規則無法由於向后兼容,因此實現了此功能,因此必須發明另一個功能,只是將其包裝為std::mkdir()

當然,到目前為止,向后兼容性的重要性甚至更大,在這里似乎確實沒有任何合理的選擇-除了建議人們使用毫不含糊的wxFileName :: Mkdir()

</sad-story>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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