1. C# / Говнокод #6915

    +126

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    private string ReadFile(string filePath)
    {
        string fileText = string.Empty;
        int openAttempts = 0;
        try
        {
            using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252)))
                {
                    fileText = sr.ReadToEnd();
                    if (!sr.EndOfStream)
                    {
                        sr.Close();
                        fs.Close();
                        throw new Exception();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            //Throw an error if the number of attempts is equal to the number of configured retries
            if (openAttempts == 20)
                throw new Exception(ex.Message);
            else
            {
                openAttempts += 1;
                Thread.Sleep(1000); //Put the thread to sleep for the configured amount of time
                ReadFile(filePath);
            }
        }
    
        return fileText;
    }

    Тут все, и управление исключениями, и бессмысленная рекурсия, и глупые ошибки. Про то, что это можно было заменить на одну строчку я молчу даже.

    Запостил: Jabberwok, 10 Июня 2011

    Комментарии (13) RSS

    • Обратите внимание на строку #30... в случае ошибки пытаемся прочитать файл 20 раз, и... ничего не возвращаем. Результат будет string.Empty
      Ответить
    • > if (openAttempts == 20)

      В виндах тоже есть NFS?!!
      Ответить
    • Меня заинтересовал вот этот момент:
      fileText = sr.ReadToEnd();
      if (!sr.EndOfStream)

      В этот файл параллельно чтению могут записываться данные из другого места? Так как именно для такого сценария данный велосипед. ОП, поясни.
      Ответить
      • Я сам не понял (не знаком с автором). По смыслу да, но на самом деле там в файл точно никто не будет параллельно писать, и мне кажется, что автор думает, что это признак какой-то астральной ошибки и надо кинуть Exception.
        Ответить
      • три момента о параллельности:

        Во-первых, чтобы работать с fs ||, надо создавать его с флагом FileOptions.Asynchronous

        Во-вторых, fileText = sr.ReadToEnd() - просто вызов синхронной операции, а асинхронная должна быть похожа на BeginRead или как то так

        В-третьих: if (!sr.EndOfStream). Это могло ввести тебя в заблуждение из-за схожести с каким нибудь IsCompleted на инстансе IAsyncRezult, если показалось, что это "опрос". А если показалось, что это "ожидание завершения", то это должен был быть вызов метода, принимающего инстанс IAsyncRezult и отдающего строчку. Наверное. Это я про строчку :)

        Маленький ликбез: в APM(асинхронус программинг модэл, простите меня за мой французский) бывает три типа стыковки: регулярный опрос, ожидание завершения и обратный вызов(именуемый как callback)
        Ответить
        • UPD: думаю, что автор вообще не думал о паралельности, знаете, как это бывает, когда прочитал о чем-то прекрасном, и решил сделать так же :)
          и вообще это свойство "в конце ли мой поинтер?", ессно что в конце и ничего не возбуждается в теле условия
          Наверное надо пожелать автору удачи, точнее гудлака, он же eng-speaking guy ;)

          PS: что-то не дают мне редактировать первое сообщение..
          Ответить
        • это все очень интересно, но мне думается, что автор не задавался такими серьезными вопросами.
          Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • - Может, и похоже, - я попытался надуться и сделать хоть немного обиженное лицо, но стоило Мэту прикоснуться своей ногой к моей, как вчера в кинотеатре, и я тут же сломался.
      Ответить

    Добавить комментарий