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

    +134

    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
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    private void FormBackUpFlash_Load(object sender, EventArgs e)
      {
       DriveInfo[] allDrives = DriveInfo.GetDrives();
       foreach (DriveInfo d in allDrives)
       {
        if (d.DriveType == DriveType.Removable)
        {
         bool thisIsDisketa = false;
         if (d.Name.Contains("A:")) thisIsDisketa = true;
         if (d.Name.Contains("B:")) thisIsDisketa = true;
    
         if (thisIsDisketa)
          continue;
         else
          listBoxDevice.Items.Add(d);
        }
       }
       if (listBoxDevice.Items.Count > 0)
       {
        StatusLabel.ForeColor = Color.Blue;
        StatusLabel.Text = "Готово!";
        listBoxDevice.SelectedIndex = 0;
       }
       else
       {
        buttonWrite.Enabled = false;
        StatusLabel.ForeColor = Color.Red;
        StatusLabel.Text = "Подходящих устройств нет!";
       }
      }
    
      private void buttonWrite_Click(object sender, EventArgs e)
      {
       try
       {
        DriveInfo drv = (DriveInfo)listBoxDevice.SelectedItem;
        pathDst = Path.Combine(drv.Name, "PROJECTNAME_Backup");
        if (!Directory.Exists(Path.Combine(drv.Name, "PROJECTNAME_Backup")))
        {
         Directory.CreateDirectory(pathDst);
        }
        this.Cursor = Cursors.WaitCursor;
        DBMSSQL dbm = new DBMSSQL();
        int i;
        for (i = 0; i < 10; i++)
        {
         if (dbm.BackupDB(Path.Combine(Path.Combine(drv.Name, "PROJECTNAME_Backup"), "DataPROJECTNAMEDataContext.bak"), true))
         {
          MessageBox.Show("Резервная копия создана успешно!", "OK!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
          break;
         }
         Thread.Sleep(1000);
        }
        if (i == 10)
        {
         MessageBox.Show("Ошибка при создании резервной копии!!!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
       }
       catch (Exception e1)
       {
        MessageBox.Show(e1.Message + "\r\nЭкспорт отменен!");
        this.DialogResult = DialogResult.Cancel;
       }
       finally { this.Cursor = Cursors.Default; }
      }
    
      private void listBoxDevice_SelectedIndexChanged(object sender, EventArgs e)
      {
       try
       {
        DriveInfo drv = (DriveInfo)listBoxDevice.SelectedItem;
        labelSizeDevice.Text = drv.AvailableFreeSpace < 1000000000 ?
            string.Format("{0}MB", drv.AvailableFreeSpace / 1000000) :
            string.Format("{0:F2}GB", (float)drv.AvailableFreeSpace / 1000000000.0);
       }
       catch (Exception e1)
       {
        MessageBox.Show(e1.Message);
       }
      }

    Три в одном.
    Исключаем флоппи из списка дисков, 10 раз пытаемся создать бэкап и 1000000 байт в мегабайте.

    Запостил: just_nameless, 15 Октября 2013

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

    • >1000000 байт в мегабайте
      Но ведь по СИ правильно!
      Ответить
    • >1000000 байт в мегабайте.
      Правильно. И 2^20 в MiB.
      Ответить
    • Path.Combine тоже классный, там же params.
      И флаг для дискет. А способ определения дискет :D
      А Exception - это отмена!
      Ответить
      • Кстати, я, в своё время, другого способа определить дискету в C# и не нашёл. Flash-карты и дискеты имеют одинаковый тип - DriveType.Removable.
        Возможно, где-то в недрах WinAPI оно и есть, но в C# не забиндено.
        Ответить
        • По запросу в гугле "C# DriveInfo floppy" первая же ссылка ведет на вопрос на StackOverflow с ответом.
          http://stackoverflow.com/a/4520267/371970
          Ответить
          • > asked Jun 17 '10
            Я в 2009м вопросом интересовался )
            Ответить
        • Вероятно, фильтровать по размеру было бы правильнее. И ещё всякие кард-ридеры выкинуть из списка, если в них карты нет.
          Ответить
          • А еще лучше не ебать мозг себе и юзерам, а показать стандартный и привычный диалог выбора директории...
            Ответить
            • Я понимаю, что весь этот код написан только ради того, чтобы показать юзеру объем свободного места на его дисках...

              Но нахрен юзеру сдался этот объем? :) Он что, должен сравнить его на глаз с предполагаемым размером бекапа (который скорее всего нигде и не показан)? Да нихуя! Юзер и так заранее знает, куда он хочет положить бекап. Это или флешка, которую он только что воткнул, или папка backups где-то на диске. И в 99% случаев он не будет указывать другой диск, а тупо пойдет и удалит с флешки порнуху ненужные файлы. Поэтому, имхо, достаточно сообщения в духе "На диске X недостаточно свободного места. Пожалуйста, освободите еще 500MiB на диске X: или укажите другой путь."
              Ответить
              • Но, кстати, на флешке, внезапно для пользователя, места может и не быть. Либо не та флешка, либо от мусора чистить надо.
                Ответить
                • Ну поэтому я и пишу: Поэтому, имхо, достаточно сообщения в духе "На диске X недостаточно свободного места. Пожалуйста, освободите еще 500MiB на диске X: или укажите другой путь." Т.е. даем юзеру выбрать папку. Если места в ней не хватит - просто сообщаем ему. Зачем заставлять юзера делать всякие сравнения и вычитания в уме, если программа вполне может сделать все сама? :)

                  Кстати, еще насчет неудобств окна выбора диска. Вот воткнуто у юзера две флешки F и G. Он не помнит какая из них какая. Ему придется сходить в "мой компьютер", и поглядеть что там где. А с обычным выбором директории он тупо узнает флешку по знакомым папкам на ней...

                  Поэтому, процитирую себя: "а еще лучше не ебать мозг себе и юзерам, а показать стандартный и привычный диалог выбора директории..."
                  Ответить
                  • > еще 500MiB
                    Не факт, что мы заранее знаем точный размер, или вообще какой бы то ни было
                    Ответить
                    • А юзер его знает? :)
                      Ответить
                      • Тоже не факт, но может предполагать. Например размер итогового архива выборки из базы вряд ли будет больше самой базы.
                        Ответить
                        • Ну или чуть больше размера предыдущего бекапа (если они не инкрементальные).
                          Ответить
        • Ни фига не в недрах, эти функции юзают сплошь и рядом.
          GetVolumeInformation/DeviceIOControl/GetDriveType
          Ответить
    • бэкап базы данных на дискету? О.о
      Ответить
      • Как раз дискеты не вносятся в список потенциальных носителей для бекапа.
        Ответить
    • bool thisIsDisketa = false;
           if (d.Name.Contains("A:")) thisIsDisketa = true;
           if (d.Name.Contains("B:")) thisIsDisketa = true;


      DeviceIOcontrol/GetDriveType для петушков, что Вы...

      >> thisIsDisketa

      этоЛСДискета
      Ответить
    • THIS! IS! SPAR DISKETAAAA!!!
      Ответить
      • if(DasIsdisketka() == Ya.Ya)
        {
        TodoInNextVersion();//клянусь
        }
        Ответить

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