Си диез / Говнокод #13953 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 just_nameless, (Updated )

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

  • >1000000 байт в мегабайте
    Но ведь по СИ правильно!
    Ответить
  • Path.Combine тоже классный, там же params.
    И флаг для дискет. А способ определения дискет 😀
    А Exception - это отмена!
    Ответить
    • Кстати, я, в своё время, другого способа определить дискету в C# и не нашёл. Flash-карты и дискеты имеют одинаковый тип - DriveType.Removable.
      Возможно, где-то в недрах WinAPI оно и есть, но в C# не забиндено.
      Ответить
      • Вероятно, фильтровать по размеру было бы правильнее. И ещё всякие кард-ридеры выкинуть из списка, если в них карты нет.
        Ответить
        • А еще лучше не ебать мозг себе и юзерам, а показать стандартный и привычный диалог выбора директории...
          Ответить
          • Я понимаю, что весь этот код написан только ради того, чтобы показать юзеру объем свободного места на его дисках...

            Но нахрен юзеру сдался этот объем? 🙂 Он что, должен сравнить его на глаз с предполагаемым размером бекапа (который скорее всего нигде и не показан)? Да нихуя! Юзер и так заранее знает, куда он хочет положить бекап. Это или флешка, которую он только что воткнул, или папка 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

    этоЛСДискета
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8