2017-09-23 10 views
8

मैं एक साधारण फ़ंक्शन बना रहा हूं जो एक यादृच्छिक फ़ाइल बनाता है। थ्रेड सुरक्षित होने के लिए, यह फ़ाइल को पुनः प्रयास लूप में बनाता है और यदि फ़ाइल मौजूद है तो यह फिर से प्रयास करती है।क्या .NET मानक हर प्लेटफॉर्म पर HResult मानों को सामान्यीकृत करता है?

while (true) 
{ 
    fileName = NewTempFileName(prefix, suffix, directory); 

    if (File.Exists(fileName)) 
    { 
     continue; 
    } 

    try 
    { 
     // Create the file, and close it immediately 
     using (var stream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write, FileShare.Read)) 
     { 
      break; 
     } 
    } 
    catch (IOException e) 
    { 
     // If the error was because the file exists, try again 
     if ((e.HResult & 0xFFFF) == 0x00000050) 
     { 
      continue; 
     } 

     // else rethrow it 
     throw; 
    } 
} 

MSDN के अनुसार, HRESULT मूल्य COM जो इंगित करने के लिए यह केवल विंडोज पर काम करेंगे प्रतीत होता है से ली गई है, और यह specifically lists them as "Win32 codes"। लेकिन यह एक पुस्तकालय में है जो .NET मानक को लक्षित करता है और आदर्श रूप से इसे every platform .NET Standard supports पर काम करना चाहिए।

मुझे क्या आश्चर्य है कि क्या मैं उपर्युक्त दृष्टिकोण पर भरोसा कर सकता हूं कि एचआरसल्ट से मूल्य का उपयोग क्रॉस-प्लेटफॉर्म होने के लिए किया जाता है? documentation इस बिंदु पर स्पष्ट नहीं है।

यदि नहीं, तो मैं कैसे निर्धारित करूं कि अन्य प्लेटफार्मों पर एचआरसल्ट मूल्यों की अपेक्षा क्या है?

नोट: एक समान प्रश्न Does .NET define common HRESULT values? नहीं है, लेकिन नेट मानक (और नेट के लिए पार मंच समर्थन) से पहले ही अस्तित्व में यह कहा गया था, इसलिए मैं इस उद्देश्य के लिए है कि इसका जवाब पर भरोसा नहीं कर सकते हैं।

अभी के लिए, हमारे codebase केवल उपयोग करता है:

  1. 0x00000020 - ERROR_SHARING_VIOLATION
  2. 0x00000021 - ERROR_LOCK_VIOLATION
  3. 0x00000050 - ERROR_FILE_EXISTS

हम नेट स्टैंडर्ड 1.5 लक्षित कर रहे हैं।

नोट: स्वीकार किए जाते हैं जवाब संतुष्ट करता जबकि क्या मैं यहाँ से पूछा, मैं एक अनुवर्ती प्रश्न How do I make catching generic IOExceptions reliably portable across platforms?

+0

मैं तुम्हें परिदृश्य या विशिष्ट त्रुटि कोड आप पर भरोसा करते हैं करना चाहते हैं के बारे में अधिक विशिष्ट होना .. ऐसे कई स्थानों सूचियों गए हैं लगता है पूर्वनिर्धारित कोडों का उपयोग किया जाता है (आप कोरसीएलआर और फुलफैक्स संदर्भ स्रोत कोड दोनों में 'hresults.cs' की खोज कर सकते हैं) और कुछ मामलों के लिए सामान्यीकरण कार्य होते हैं [जैसे फ़ाइल त्रुटियों के लिए] [https://github.com/dotnet /coreclr/blob/5c07c5aa98f8a088bf25099f1ab2d38b59ea5478/src/pal/src/file/file.cpp#L184-L194)। –

+0

धन्यवाद मार्टिन। मैंने 3 त्रुटियों को जोड़ा जो मुझे वर्तमान में रूचि है। हालांकि, थोड़ी अधिक सामान्य उत्तर की उम्मीद थी। आम तौर पर, हम केवल फाइल आईओ त्रुटियों में रुचि रखते हैं। – NightOwl888

+0

आप msdn के बजाय [इस दस्तावेज़] [https://docs.microsoft.com/en-us/dotnet/api/system.exception.hresult?view=netstandard-1.5) से लिंक करना चाहेंगे क्योंकि यह है आधिकारिक .NET मानक 1.5 एपीआई दस्तावेज़। (निश्चित रूप से यह एमएसडीएन की एक प्रतिलिपि और पेस्ट है, लेकिन सही जगह पर इंगित करना अच्छा है) –

उत्तर

7

Exception.HResult मूल्यों प्लेटफार्मों पर मानकीकृत नहीं कर रहे हैं।

I/O त्रुटियों के लिए, .NET कोर प्लेटफ़ॉर्म विशिष्ट त्रुटि कोड HResult के रूप में वापस करेगा। फ़ाइल के लिए HResult प्रॉपर्टी का मान आपके उदाहरण में पहले से मौजूद है लिनक्स पर 17 हो रहा है, और यह अन्य यूनिक्स सिस्टम के लिए अलग-अलग मूल्य हो सकता है।

प्रासंगिक कोड है कि यूनिक्स पर अपवादों के आईओ त्रुटियों नक्शे यहाँ है: https://github.com/dotnet/corefx/blob/master/src/Common/src/Interop/Unix/Interop.IOErrors.cs

+0

धन्यवाद। दुर्भाग्यवश, आपके द्वारा प्रदान किया गया लिंक केवल कोड दिखाता है, लेकिन संसाधन फ़ाइल नहीं जो मूल्य प्रदान करता है। उस निर्देशिका में अन्य प्लेटफार्मों के लिए एक संबंधित फ़ाइल प्रतीत नहीं होती है। क्या मैं इससे दूर हूं कि उपरोक्त दृष्टिकोण को विश्वसनीय नहीं बनाया जा सकता है? या क्या सभी प्लेटफार्मों के लिए आवश्यक सभी मूल्यों को प्राप्त करने का कोई तरीका है? ध्यान दें मुझे प्रत्येक प्लेटफ़ॉर्म के लिए केवल मेरे प्रश्न में 3 त्रुटियों की आवश्यकता है .NET मानक 1.5 का समर्थन करता है। – NightOwl888

+0

इस दृष्टिकोण को विश्वसनीय पोर्टेबल नहीं बनाया जा सकता है। इस मामले में HResult वह अंतर्निहित ऑपरेटिंग सिस्टम देता है। यह लिनक्स, मैकोज़, फ्रीबीएसडी, ... के बीच भिन्न हो सकता है। मैं इसे स्पष्ट करने के लिए पोस्ट संपादित करूंगा। –

संबंधित मुद्दे