2013-06-04 11 views
9

मैं एक गैर प्रारूपित एसडी कार्ड से 8 जीबी हेक्स डेटा पढ़ने के लिए एक सी # उपकरण विकसित कर रहा हूं।FileNotFoundException यादृच्छिक रूप से

यह ऐसा करने में सक्षम है, लेकिन यह यादृच्छिक रूप से फ़ाइल नहीं मिला अपवाद फेंकता है। उदाहरण के लिए, यह एक गीगाबाइट या दो पढ़ेगा, फिर इसे फेंक दें। अन्य बार यह पंक्ति में कुछ बार 8 जीबी पढ़ेगा, फिर अपवाद फेंक देगा। दूसरे शब्दों में, यह पूरी तरह से यादृच्छिक रूप से पॉप अप प्रतीत होता है।

मुझे नहीं पता कि इसका कारण क्या हो सकता है।

संपादित करें: मैंने कुछ चीजों को ट्विक करने के लिए प्रतिक्रिया का उपयोग किया है। नीचे चिपकाया गया अद्यतन कोड है।

यह अभी भी यादृच्छिक रूप से filenotfoundexception फेंकता है, लेकिन यह अब एक तर्क अपवाद फेंकता है जब यह mig 432 के mb 432 को पढ़ने की कोशिश करता है (यदि यह बिना किसी यादृच्छिक रूप से filenotfound फेंक देता है)।

त्रुटि शिकायत करती है कि फ़ाइलहेडल सिंक्रोनस ऑपरेशंस का समर्थन नहीं करता है।

संदेश:: निर्दिष्ट फ़ाइल ढूंढने में असमर्थ

class Program 
{ 
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, 
     uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, 
     uint dwFlagsAndAttributes, IntPtr hTemplateFile); 

    static void Main(string[] args) 
    { 
     string testOutputDirectory = @"C:\\Users\\aiovanna\\Desktop\\out1.txt"; //Specifies where to write the results of the read. 
     try 
     { 
      SafeFileHandle fileHandle = CreateFile("\\\\.\\E:", 0x80000000, 0, IntPtr.Zero, 3, 0, IntPtr.Zero); 
      FileStream readStream = new FileStream(fileHandle, FileAccess.Read); //The stream to be read. Is converted to binary. 
      BufferedStream bufStream = new BufferedStream(readStream, 1048576); 
      FileStream writeStream = File.OpenWrite(testOutputDirectory); //Writing stream opened at the specified directory of output. 
      //BinaryReader reader = new BinaryReader(readStream); //Changes the read stream to binary. Has more powerful methods. 

      long gigsRead; //Loop counter that specifies the number of gigabytes read thus far. 
      long megsRead; //Loop counter that specifies the number of megabytes read thus far within the current gigabyte. 

      Stopwatch totalStopwatch = new Stopwatch(); //Stopwatch to time the total execution of the card read. 
      Stopwatch megStopwatch = new Stopwatch(); //Stopwatch to time the execution of reading the current megabyte. 
      Stopwatch gigStopwatch = new Stopwatch(); //Stopwatch to time the executation of reading the current gigabyte. 
      totalStopwatch.Start(); //Start timing the program. 
      int bytesRead; 

      for (gigsRead = 0; gigsRead < 8; gigsRead++) //Gigabyte loop 
      { 
       gigStopwatch.Start(); //Start timer for current gigabyte. 
       for (megsRead = 0; megsRead < 1024; megsRead++) //Megabyte loop 
       { 
        megStopwatch.Start(); //Start timer for current megabyte. 

        try 
        { 
         byte[] buffer = new byte[1048576]; //Buffer to be read into from card 
         long test = gigsRead * 1073741824 + megsRead * 1048576; 
         bufStream.Position = test; 
         bytesRead = bufStream.Read(buffer, 0, 1048576); //Read from SD card to buffer 
         if (bytesRead < 1048576) 
         { 
          Console.WriteLine("Didn't read whole chunk!"); 
         } 
         writeStream.Write(buffer, 0, 1048576); //Write from buffer to output text file. 
         megStopwatch.Stop(); //Stop timer for current megabyte. 
         Console.WriteLine("Finished mb {0} of gig {1} in {2}", megsRead + 1, gigsRead + 1, megStopwatch.Elapsed); 
         megStopwatch.Reset(); //Reset for next megabyte. 
        } 

        catch (System.IO.FileNotFoundException ex) 
        { 
         System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
         System.Console.WriteLine("Message: {0}", ex.Message); 
         System.Console.WriteLine("Source: {0}", ex.Source); 
         System.Console.WriteLine("Stack Trace: {0}", ex.StackTrace); 
         System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
         System.Console.WriteLine(ex.ToString()); 
         writeStream.Close(); //Close writing stream. 
         //reader.Close(); //Close the binary reader stream. 
         bufStream.Close(); 
         fileHandle.Close(); //Close the SD card file. 
         readStream.Close(); //Close the filestream reader. 
         System.Console.WriteLine("You will need to turn off your computer, take out the card, turn the computer back on, put the SD card back in, and re-run the program."); 
         System.Console.WriteLine("Press any key to terminate."); 
         System.Console.ReadKey(); 
         System.Environment.Exit(1); 
        } 

        catch (System.ArgumentException ex) 
        { 
         System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
         System.Console.WriteLine("Message: {0}", ex.Message); 
         System.Console.WriteLine("Param Name: {0}", ex.ParamName); 
         System.Console.WriteLine("Source: {0}", ex.Source); 
         System.Console.WriteLine("Stack Trace: {0}", ex.StackTrace); 
         System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
         System.Console.WriteLine(ex.ToString()); 
         writeStream.Close(); //Close writing stream. 
         //reader.Close(); //Close the binary reader stream. 
         fileHandle.Close(); //Close the SD card file. 
         readStream.Close(); //Close the filestream reader. 
         System.Console.WriteLine("You will need to turn off your computer, take out the card, turn the computer back on, put the SD card back in, and re-run the program."); 
         System.Console.WriteLine("Press any key to terminate."); 
         System.Console.ReadKey(); 
         System.Environment.Exit(1); 
        } 
       } 
       gigStopwatch.Stop(); //Stop timer for current gigabyte. 
       Console.WriteLine("Finished gig {0} in {1}", gigsRead + 1, gigStopwatch.Elapsed); 
       gigStopwatch.Reset(); //Reset for next gigabyte. 
      } 
      totalStopwatch.Stop(); //Stop total execution timer. 
      Console.WriteLine(totalStopwatch.Elapsed); //Print total execution timer. 
      writeStream.Close(); //Close writing stream. 
      //reader.Close(); //Close the binary reader stream. 
      writeStream.Close(); //Close writing stream. 
      fileHandle.Close(); //Close the SD card file. 
      readStream.Close(); //Close the filestream reader. 
      bufStream.Close(); 
     } 

     catch (System.IO.IsolatedStorage.IsolatedStorageException ex) 
     { 
      System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
      System.Console.WriteLine("Isolated Storage Exception"); 
      System.Console.WriteLine("Data: {0}", ex.Data); 
      System.Console.WriteLine("Help Link: {0}", ex.HelpLink); 
      System.Console.WriteLine("Inner Exception: {0}", ex.InnerException); 
      System.Console.WriteLine("Message: {0}", ex.Message); 
      System.Console.WriteLine("Source: {0}", ex.Source); 
      System.Console.WriteLine("Stack Trace {0}", ex.StackTrace); 
      System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
      Console.ReadKey(); 
     } 

     catch (System.ArgumentException ex) 
     { 
      System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
      System.Console.WriteLine("Argument Exception"); 
      System.Console.WriteLine("Data: {0}", ex.Data); 
      System.Console.WriteLine("Help Link: {0}", ex.HelpLink); 
      System.Console.WriteLine("Inner Exception: {0}", ex.InnerException); 
      System.Console.WriteLine("Message: {0}", ex.Message); 
      System.Console.WriteLine("Param Name: {0}", ex.ParamName); 
      System.Console.WriteLine("Source: {0}", ex.Source); 
      System.Console.WriteLine("Stack Trace {0}", ex.StackTrace); 
      System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
      Console.ReadKey(); 
     } 

     catch (System.IO.DirectoryNotFoundException ex) 
     { 
      System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
      System.Console.WriteLine("Directory Not Found Exception"); 
      System.Console.WriteLine("Data: {0}", ex.Data); 
      System.Console.WriteLine("Help Link: {0}", ex.HelpLink); 
      System.Console.WriteLine("Inner Exception: {0}", ex.InnerException); 
      System.Console.WriteLine("Message: {0}", ex.Message); 
      System.Console.WriteLine("Source: {0}", ex.Source); 
      System.Console.WriteLine("Stack Trace {0}", ex.StackTrace); 
      System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
      System.Console.ReadKey(); 
     } 

     catch (System.ObjectDisposedException ex) 
     { 
      System.Console.WriteLine("The error was: {0}", Marshal.GetLastWin32Error()); 
      System.Console.WriteLine("Object Disposed Exception"); 
      System.Console.WriteLine("Data: {0}", ex.Data); 
      System.Console.WriteLine("Help Link: {0}", ex.HelpLink); 
      System.Console.WriteLine("Inner Exception: {0}", ex.InnerException); 
      System.Console.WriteLine("Message: {0}", ex.Message); 
      System.Console.WriteLine("Object Name {0}", ex.ObjectName); 
      System.Console.WriteLine("Source: {0}", ex.Source); 
      System.Console.WriteLine("Stack Trace {0}", ex.StackTrace); 
      System.Console.WriteLine("Target Site: {0}", ex.TargetSite); 
      Console.ReadKey(); 
     } 
    } 
} 

मैं नीचे त्रुटि है कि FileNotFoundException लिए दिखाया गया है फिर से लिखा था। स्रोत: mscorlib स्टैक ट्रेस: ​​System.IO .__ Error.WinIOError (int32 ERRORCODE, स्ट्रिंग maybeFullPath) System.IO.FileStream.ReadCore पर (बाइट [] बफर, int32 ऑफसेट, int32 गिनती) पर पर System.IO.FileStream.Read (बाइट [] सरणी, Int32 ऑफ़सेट, Int32 गिनती) System.IO.BinaryReader.Read (बाइट [] बफर, Int32 अनुक्रमणिका, Int32 गिनती) RawSDAccessTest.Program.Main पर (स्ट्रिंग {} args) सी: \ उपयोगकर्ता \ आदि ... लाइन 67 लक्ष्य साइट: शून्य WinIOError (Int32, System.String) System.IO.FileNotFoundException: असमर्थ निर्दिष्ट फ़ाइल पाएं। लाइन 67 है: पाठक। पढ़ें (बफर, 0, 1048576);

मुझे वास्तव में अजीब लगता है कि यह प्रोग्राम लाइन 65 के साथ बिल्कुल ठीक है, जो पाठक ऑब्जेक्ट का भी उपयोग करता है। लाइन 65 और 67 लाइनों को निष्पादित करने के बीच, यह निर्णय लेता है कि फ़ाइल अब मौजूद नहीं है। मैंने यह देखने के लिए इंतजार किया कि क्या यह हल करेगा। ऐसा नहीं हुआ

किसी भी विचार के कारण यह यादृच्छिक रूप से इस अपवाद को फेंकने, या इसे हल करने के लिए क्या हो सकता है?

संपादित करें: प्रक्रिया मॉनिटर दिखाता निम्नलिखित

8: 40: AM २६.१०७७१५७ SDCardReadAttempt3.vshost.exe 2432 ReadFile ई: सफलता ऑफसेट: +३२२८५६५५०४, लंबाई: 1,048,576, आई/ओ झंडे: गैर-कैश, प्राथमिकता: सामान्य

8: 40: AM २६.१७४५९७४ SDCardReadAttempt3.vshost.exe 2432 ReadFile ई: ऐसा कोई डिवाइस ऑफसेट: +३२२९६१४०८०, लंबाई: 131,072, आई/ओ झंडे: गैर-कैश, प्राथमिकता: सामान्य

तो बीच में पढ़ता है, डिवाइस मौजूद है। मैंने फ़ाइल निर्माण और आंतरिक लूप को हटाने को स्थानांतरित कर दिया, ताकि जब भी वह इसे पढ़ने की कोशिश करता है तो यह फ़ाइल बना देगा। समस्या बरकरार। मुझे हार्डवेयर की तरह बदबू आ रही है।

संपादित 2: अब यह कभी-कभी एसिंक्रोनस रीड अपवाद फेंक रहा है।

9: 16: AM १६.११२९९२६ SDCardReadAttempt3.vshost.exe 3752 ReadFile ई: अमान्य पैरामीटर ऑफसेट: +७९६९१७७६००, लंबाई: 1,048,576, आई/ओ झंडे: गैर-कैश, प्राथमिकता: सामान्य

मैं नहीं जानता कैसे .net गहराई से काम करता है। हो सकता है कि यह इसे थ्रेडेड प्रक्रिया में बना रहा हो, जब फ़ाइल एकाधिक धागे द्वारा पढ़ने के लिए खोला नहीं जाता है। मैं यह देखने के लिए वहां इंतजार करूँगा कि क्या यह त्रुटि समाप्त हो जाती है, इसलिए मैं मूल पर वापस आ सकता हूं।

+3

आप प्रक्रिया मॉनिटर देने की कोशिश की है (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) अगर यह आप किसी भी अधिक जानकारी दे सकते हैं देखने के लिए एक शॉट? –

+0

इस तरह की अड़चन समस्याएं आमतौर पर हार्डवेयर समस्या का संकेत देती हैं। यदि वास्तव में यह आवश्यक है कि आप विफलता के बाद मशीन को रीबूट करें, तो मुझे हार्डवेयर पर बहुत दृढ़ता से संदेह होगा। यदि आप COPY या ROBOCOPY या XCOPY का उपयोग कर फ़ाइल कॉपी करने का प्रयास करते हैं तो क्या होता है? –

+0

@ निकोलडेसरोसियर एक उपयोगी उपकरण की तरह लगता है। सिफारिश के लिए धन्यवाद। जिम: इन सभी विधियों में फ़ाइलपैथ स्ट्रिंग चाहिए। मुझे एक स्ट्रिंग लौटने वाले एक गैर-प्रारूपित ड्राइव के लिए फ़ाइल बनाने का कोई तरीका नहीं मिल रहा है। –

उत्तर

1

मुझे स्कैनर से पढ़ने में समान समस्याएं आई हैं। मैं अपवाद पकड़ने के लिए समाप्त हुआ, कुछ समय के लिए प्रतीक्षा करें (250 एमएस मेरे उद्देश्यों के लिए अच्छी तरह से काम किया), फिर एक ही डेटा फिर से पढ़ने की कोशिश करें। मैंने एक दहलीज परिभाषित की (6 मेरे लिए अच्छी तरह से काम किया) जिस बिंदु पर मैंने छोड़ दिया और उपयोगकर्ता को एक त्रुटि उठाई।

ऐसा लगता है कि हार्डवेयर ज्यादातर मामलों में पकड़ने के लिए पर्याप्त समय देता है।

इसके अलावा, आपको केवल उस ब्लॉक को पढ़ने का प्रयास करें जो आपको परेशानी दे रहा है। यदि आपको लगातार एक विशिष्ट ब्लॉक पढ़ने में त्रुटि मिलती है, तो आपके पास स्पष्ट रूप से हार्डवेयर समस्या है।

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