bolumleme.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. import sys, parted
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. from PyQt5.QtWidgets import *
  5. ####################################################################
  6. def main():
  7. app = QApplication(sys.argv)
  8. app.setApplicationName('Bölümleme Demosu')
  9. w = Bolumleme()
  10. w.show()
  11. sys.exit(app.exec_())
  12. ####################################################################
  13. class Bolumleme(QWidget):
  14. def __init__(self, *args):
  15. QWidget.__init__(self, *args)
  16. self.diskler = parted.getAllDevices()
  17. disklerWidget = QWidget()
  18. disklerLayout = QHBoxLayout()
  19. self.disklerAcilirKutu = QComboBox()
  20. self.yenileButon = QPushButton("Yenile")
  21. self.yenileButon.pressed.connect(self.diskYenile)
  22. for disk in self.diskler:
  23. try:
  24. if parted.Disk(disk).type == "msdos":
  25. self.disklerAcilirKutu.addItem("{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"),'.2f'), disk.path), userData=disk.path)
  26. except parted.DiskLabelException:
  27. disk = parted.freshDisk(disk, 'msdos')
  28. # CDROM Aygıtları için
  29. try:
  30. disk.commit()
  31. except parted.IOException:
  32. pass
  33. else:
  34. disk = disk.device
  35. self.disklerAcilirKutu.addItem("{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"),'.2f'), disk.path), userData=disk.path)
  36. self.disklerAcilirKutu.currentIndexChanged.connect(self.diskDegisti)
  37. if self.disklerAcilirKutu.currentData():
  38. self.aygit = parted.getDevice(self.disklerAcilirKutu.currentData())
  39. self.disk = parted.Disk(self.aygit)
  40. self.bolumListeKutu = QListWidget()
  41. for bolum in self.disk.partitions:
  42. _bolum = self.bolumBilgi(bolum, "GB")
  43. item = QListWidgetItem("{}\t\t{} GB\t{}\t{}".format(_bolum["yol"],_bolum["boyut"],_bolum["dosyaSis"],_bolum["bayraklar"]))
  44. item.setData(Qt.UserRole, _bolum["no"])
  45. if _bolum["tur"] == parted.PARTITION_NORMAL:
  46. item.setIcon(QIcon("gorseller/primary.xpm"))
  47. elif _bolum["tur"] == parted.PARTITION_EXTENDED:
  48. item.setIcon(QIcon("gorseller/extended.xpm"))
  49. elif _bolum["tur"] == parted.PARTITION_LOGICAL:
  50. item.setIcon(QIcon("gorseller/logical.xpm"))
  51. self.bolumListeKutu.addItem(item)
  52. for bosBolum in self.disk.getFreeSpacePartitions():
  53. _toplam = 0
  54. _bolum = self.bolumBilgi(bosBolum, "GB")
  55. if float(_bolum["boyut"]) > 0:
  56. if _bolum["tur"] == 5:
  57. uzatilmisKalan = QListWidgetItem("{}\t{} GB".format("Uzatılmış Bölüm Kalan",_bolum["boyut"]))
  58. uzatilmisKalan.setIcon(QIcon("gorseller/blank.xpm"))
  59. uzatilmisKalan.setData(Qt.UserRole, "ayrilmamis")
  60. self.bolumListeKutu.addItem(uzatilmisKalan)
  61. if _bolum["tur"] == parted.PARTITION_FREESPACE:
  62. _toplam = _toplam + float(_bolum["boyut"])
  63. ayrilmamis = QListWidgetItem("{}\t{} GB".format("Ayrılmamış Bölüm",_toplam))
  64. ayrilmamis.setIcon(QIcon("gorseller/blank.xpm"))
  65. ayrilmamis.setData(Qt.UserRole, "ayrilmamis")
  66. self.bolumListeKutu.addItem(ayrilmamis)
  67. disklerLayout.addWidget(self.disklerAcilirKutu)
  68. disklerLayout.addWidget(self.yenileButon)
  69. disklerWidget.setLayout(disklerLayout)
  70. layout = QVBoxLayout()
  71. layout.addWidget(disklerWidget)
  72. layout.addWidget(self.bolumListeKutu)
  73. lejant = QLabel()
  74. lejant.setPixmap(QPixmap("gorseller/lejant.png"))
  75. lejant.setAlignment(Qt.AlignCenter)
  76. layout.addWidget(lejant)
  77. self.bolumListeKutu.itemClicked.connect(self.bolumSecildiFonk)
  78. self.bolumListeKutu.itemDoubleClicked.connect(self.bolumFormatSecFonk)
  79. opWidget=QWidget()
  80. opButonlar = QHBoxLayout()
  81. self.yeniBolumBtn = QPushButton("Yeni Bölüm Ekle")
  82. self.yeniBolumBtn.pressed.connect(self.bolumEkleFonk)
  83. self.bolumSilBtn = QPushButton("Bölümü Sil")
  84. self.bolumSilBtn.pressed.connect(self.bolumSilFonk)
  85. self.kaydetBtn = QPushButton("Kaydet")
  86. self.kaydetBtn.pressed.connect(self.kaydet)
  87. opButonlar.addWidget(self.yeniBolumBtn)
  88. opButonlar.addWidget(self.bolumSilBtn)
  89. opButonlar.addWidget(self.kaydetBtn)
  90. opWidget.setLayout(opButonlar)
  91. layout.addWidget(opWidget)
  92. self.bolumSilBtn.setEnabled(False)
  93. self.setLayout(layout)
  94. def kaydet(self):
  95. self.disk.commit()
  96. def bolumFormatSecFonk(self, tiklanan):
  97. if tiklanan.data(Qt.UserRole) != "ayrilmamis":
  98. for bolum in self.disk.partitions:
  99. if bolum.number == tiklanan.data(Qt.UserRole):
  100. print(bolum.path)
  101. def bolumBilgi(self, bolum, birim):
  102. _bolum = {}
  103. _bolum["yol"] = bolum.path
  104. if birim == "GB":
  105. _bolum["boyut"] = format(bolum.getSize(unit=birim),'.2f')
  106. else:
  107. _bolum["boyut"] = bolum.getSize(unit=birim)
  108. _bolum["dosyaSis"] = "Bilinmeyen"
  109. if bolum.fileSystem:
  110. if bolum.fileSystem.type.startswith('linux-swap'):
  111. _bolum["dosyaSis"] = "takas"
  112. else:
  113. _bolum["dosyaSis"] = bolum.fileSystem.type
  114. try:
  115. _bolum["bayraklar"] = bolum.getFlagsAsString()
  116. except:
  117. pass
  118. _bolum["no"] = bolum.number
  119. _bolum["tur"] = bolum.type
  120. return _bolum
  121. def diskYenile(self):
  122. self.disklerAcilirKutu.clear()
  123. self.diskler = parted.getAllDevices()
  124. for disk in self.diskler:
  125. try:
  126. if parted.Disk(disk).type == "msdos":
  127. self.disklerAcilirKutu.addItem("{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"),'.2f'), disk.path), userData=disk.path)
  128. except parted.DiskLabelException:
  129. disk = parted.freshDisk(disk, 'msdos')
  130. # CDROM Aygıtları için
  131. try:
  132. disk.commit()
  133. except parted.IOException:
  134. pass
  135. else:
  136. disk = disk.device
  137. self.disklerAcilirKutu.addItem("{} {} GB ({})".format(disk.model, format(disk.getSize(unit="GB"),'.2f'), disk.path), userData=disk.path)
  138. def diskDegisti(self):
  139. if self.disklerAcilirKutu.currentData():
  140. self.aygit = parted.getDevice(self.disklerAcilirKutu.currentData())
  141. self.disk = parted.Disk(self.aygit)
  142. self.bolumListeYenile()
  143. def bolumListeYenile(self):
  144. self.bolumListeKutu.clear()
  145. for bolum in self.disk.partitions:
  146. _bolum = self.bolumBilgi(bolum, "GB")
  147. item = QListWidgetItem("{}\t\t{} GB\t{}\t{}".format(_bolum["yol"],_bolum["boyut"],_bolum["dosyaSis"],_bolum["bayraklar"]))
  148. item.setData(Qt.UserRole, _bolum["no"])
  149. if _bolum["tur"] == parted.PARTITION_NORMAL:
  150. item.setIcon(QIcon("gorseller/primary.xpm"))
  151. elif _bolum["tur"] == parted.PARTITION_EXTENDED:
  152. item.setIcon(QIcon("gorseller/extended.xpm"))
  153. elif _bolum["tur"] == parted.PARTITION_LOGICAL:
  154. item.setIcon(QIcon("gorseller/logical.xpm"))
  155. self.bolumListeKutu.addItem(item)
  156. for bosBolum in self.disk.getFreeSpacePartitions():
  157. _toplam = 0
  158. _bolum = self.bolumBilgi(bosBolum, "GB")
  159. if float(_bolum["boyut"]) > 0:
  160. if _bolum["tur"] == 5:
  161. uzatilmisKalan = QListWidgetItem("{}\t{} GB".format("Uzatılmış Bölüm Kalan",_bolum["boyut"]))
  162. uzatilmisKalan.setIcon(QIcon("gorseller/blank.xpm"))
  163. uzatilmisKalan.setData(Qt.UserRole, "ayrilmamis")
  164. self.bolumListeKutu.addItem(uzatilmisKalan)
  165. if _bolum["tur"] == parted.PARTITION_FREESPACE:
  166. _toplam = _toplam + float(_bolum["boyut"])
  167. ayrilmamis = QListWidgetItem("{}\t{} GB".format("Ayrılmamış Bölüm",_toplam))
  168. ayrilmamis.setIcon(QIcon("gorseller/blank.xpm"))
  169. ayrilmamis.setData(Qt.UserRole, "ayrilmamis")
  170. self.bolumListeKutu.addItem(ayrilmamis)
  171. def bolumSecildiFonk(self,tiklanan):
  172. if tiklanan.data(Qt.UserRole) != "ayrilmamis":
  173. self.bolumSilBtn.setEnabled(True)
  174. else:
  175. self.bolumSilBtn.setEnabled(False)
  176. def bolumSilFonk(self):
  177. bolumNo = self.bolumListeKutu.currentItem().data(Qt.UserRole)
  178. for bolum in self.disk.partitions:
  179. if bolum.number == bolumNo:
  180. try:
  181. self.disk.deletePartition(bolum)
  182. self.bolumListeYenile()
  183. except parted.PartitionException:
  184. QMessageBox.warning(self,"Uyarı",
  185. "Lütfen uzatılmış bölümleri silmeden önce mantıksal bölümleri siliniz.")
  186. self.bolumListeKutu.setCurrentRow(self.bolumListeKutu.count() - 2)
  187. def bolumEkleFonk(self):
  188. if self._en_buyuk_bos_alan():
  189. alan = self._en_buyuk_bos_alan()
  190. birincilSayi = len(self.disk.getPrimaryPartitions())
  191. uzatilmisSayi = ext_count = 1 if self.disk.getExtendedPartition() else 0
  192. parts_avail = self.disk.maxPrimaryPartitionCount - (birincilSayi + uzatilmisSayi)
  193. if not parts_avail and not ext_count:
  194. QMessageBox.warning(self,
  195. "Uyarı",
  196. """Eğer dörtten fazla disk bölümü oluşturmak istiyorsanız birincil bölümlerden birini silip uzatılmış bölüm oluşturun.
  197. Bu durumda oluşturduğunuz uzatılmış bölümleri işletim sistemi kurmak için kullanamayacağınızı aklınızda bulundurun."""
  198. )
  199. else:
  200. if parts_avail:
  201. if not uzatilmisSayi and parts_avail > 1:
  202. self.bolumOlustur(alan, parted.PARTITION_NORMAL)
  203. self.bolumListeYenile()
  204. elif parts_avail == 1:
  205. self.bolumOlustur(alan, parted.PARTITION_EXTENDED)
  206. self.bolumListeYenile()
  207. if uzatilmisSayi:
  208. ext_part = self.disk.getExtendedPartition()
  209. try:
  210. alan = ext_part.geometry.intersect(alan)
  211. except ArithmeticError:
  212. QMessageBox.critical(self,"Hata","Yeni disk bölümü oluşturmak için yeterli alan yok ! Uzatılmış bölümün boyutunu arttırmayı deneyiniz.")
  213. else:
  214. self.bolumOlustur(alan, parted.PARTITION_LOGICAL)
  215. self.bolumListeYenile()
  216. else:
  217. QMessageBox.critical(self,"Hata","Yeni disk bölümü oluşturmak için yeterli alan yok !")
  218. def _en_buyuk_bos_alan(self):
  219. maks_boyut = -1
  220. alan = None
  221. alignment = self.aygit.optimumAlignment
  222. for _alan in self.disk.getFreeSpaceRegions():
  223. if _alan.length > maks_boyut and _alan.length > alignment.grainSize:
  224. alan = _alan
  225. maks_boyut = _alan.length
  226. return alan
  227. def bolumOlustur(self, alan, bolumTur):
  228. if bolumTur == parted.PARTITION_NORMAL or bolumTur == parted.PARTITION_EXTENDED:
  229. for bosBolum in self.disk.getFreeSpacePartitions():
  230. _bolum = self.bolumBilgi(bosBolum, "GB")
  231. if _bolum["tur"] == parted.PARTITION_FREESPACE:
  232. maksBoyut = float(_bolum["boyut"])
  233. elif bolumTur == bolumTur == parted.PARTITION_LOGICAL:
  234. for bosBolum in self.disk.getFreeSpacePartitions():
  235. _bolum = self.bolumBilgi(bosBolum, "GB")
  236. if _bolum["tur"] == 5:
  237. maksBoyut = float(_bolum["boyut"])
  238. alignment = self.aygit.optimalAlignedConstraint
  239. constraint = self.aygit.getConstraint()
  240. data = {
  241. 'start': constraint.startAlign.alignUp(alan, alan.start),
  242. 'end': constraint.endAlign.alignDown(alan, alan.end),
  243. }
  244. boyut, ok = QInputDialog().getDouble(self, 'Bölüm oluştur', 'GB cinsinden boyut:',min=0.001,value=1, max=maksBoyut,decimals=3)
  245. if ok:
  246. data["end"] = int(data["start"]) + int(parted.sizeToSectors(float(boyut),"GiB", self.aygit.sectorSize))
  247. try:
  248. geometry = parted.Geometry(device=self.aygit, start=int(data["start"]), end=int(data["end"]))
  249. partition = parted.Partition(
  250. disk=self.disk,
  251. type=bolumTur,
  252. geometry = geometry,
  253. )
  254. self.disk.addPartition(partition=partition, constraint=constraint)
  255. except (parted.PartitionException, parted.GeometryException, parted.CreateException) as e:
  256. # GeometryException accounts for incorrect start/end values (e.g. start < end),
  257. # CreateException is raised e.g. when the partition doesn't fit on the disk.
  258. # PartedException is a generic error (e.g. start/end values out of range)
  259. raise RuntimeError(e.message)
  260. if __name__ == "__main__":
  261. main()