def OpenFolder(obj, dict): winshell.undelete(obj.obj.original_filename()) listOfDirs = os.listdir(obj.sahiPath) winshell.delete_file(obj.obj.original_filename()) fmt = "{0:3} | {1:8} | {2:10}" print(fmt.format("Sr:", "Type:", "Name:")) Sr = 0 for i in listOfDirs: Sr += 1 if "." in i: type = "file" else: type = "Folder" print(fmt.format(Sr, type, i)) print(" Enter serial no to open any file/folder \n Press B to go back ") n = input("Enter: ") if str(n) == "B" or str(n) == "b": Beginning(dict) else: try: n = eval(n) name = listOfDirs[n - 1] path = obj.sahiPath + "\\\\" + listOfDirs[n - 1] if "." in name: ClearScreen() OpenFileFromFolder(obj, path, dict) else: ClearScreen() OpenFolderFromFolder(obj, path, dict) except: ClearScreen() print(" Enter a valid serial no ") OpenFolder(obj, dict)
def DeleteItem(obj): winshell.undelete(obj.obj.original_filename()) if obj.typeOfObj == "File": os.remove(obj.sahiPath) elif obj.typeOfObj == "Folder": shutil.rmtree(obj.sahiPath) Beginning(None)
def DeleteButton(self): if self.currentItemCheck == False: winshell.undelete(self.currentItem.obj.original_filename()) if self.currentItem.typeOfObj == "File": os.remove(self.currentItem.sahiPath) elif self.currentItem.typeOfObj == "Folder": shutil.rmtree(self.currentItem.sahiPath) self.setupUi(MainWindow, True)
def OpenFile(obj, dict): try: winshell.undelete(obj.obj.original_filename()) file = open(obj.sahiPath, 'r') R = file.read() file.close() winshell.delete_file(obj.obj.original_filename()) print(R) print("Press any key to go back") key = input("Enter: ") if key != '': ClearScreen() OperationOnItem(obj, dict) except: ClearScreen() print("This file can not be opened ") OperationOnItem(obj, dict)
def Beginning(dictionary): ClearScreen() if dictionary is None: listOfItems = list(winshell.recycle_bin()) dictOfObjects = {} fmt = "{0:3} | {1:8} | {2:10}" print(fmt.format("Sr:", "Type:", "Name:")) for i, v in enumerate(listOfItems): serialNo = i + 1 path = v.original_filename() listOfPath = path.split("\\") newPath = "\\\\".join(listOfPath) winshell.undelete(path) name = listOfPath[-1] if os.path.isdir(newPath) == True: type = "Folder" size = get_dir_size(newPath) listOfFolderItems = os.listdir(newPath) noOfFolder = 0 noOfFile = 0 for i in listOfFolderItems: checkpath = newPath + '\\\\' + i if os.path.isdir(checkpath) == True: noOfFolder += 1 elif os.path.isfile(checkpath) == True: noOfFile += 1 dictOfObjects[serialNo] = DeletedObject( v, type, name, newPath, "{0:.1f}".format(size / 1024), [noOfFile, noOfFolder]) elif os.path.isfile(newPath) == True: type = "file" size = os.path.getsize(newPath) dictOfObjects[serialNo] = DeletedObject( v, type, name, newPath, "{0:.1f}".format(size / 1024), []) winshell.delete_file(path) print(fmt.format(serialNo, type, name)) SelectedItem(dictOfObjects) else: fmt = "{0:3} | {1:8} | {2:10}" print(fmt.format("Sr:", "Type:", "Name:")) for k, v in dictionary.items(): print(fmt.format(k, v.typeOfObj, v.name)) SelectedItem(dictionary)
def OpenFileFromFolder(obj, filepath, dict): try: winshell.undelete(obj.obj.original_filename()) file = open(filepath, "r") R = file.read() file.close() winshell.delete_file(obj.obj.original_filename()) print(R) print(" Press any key to go back ") key = input(" Enter: ") if key: ClearScreen() OpenFolderFromFolder(obj, "\\\\".join(filepath.split("\\\\")[:-1]), dict) except: ClearScreen() print(" This file can not be opened ") OpenFolderFromFolder(obj, "\\\\".join(filepath.split("\\\\")[:-1]), dict)
def restore(self): restore_file = open("restore.txt", 'r') self.backup() for files in restore_file: try: splitted = files.split(',') new_file = splitted[0] if len(splitted) != 2: continue filed = new_file.rstrip('\n') filepath = os.path.abspath(filed) new_file1 = splitted[1] filed2 = new_file1.rstrip('\n') new_filepath = os.path.abspath(filed2) winshell.undelete(filepath) print(Fore.GREEN + f'Restored file > {filed}') shutil.move(filepath, new_filepath) print(Fore.MAGENTA + f'Moving back to original position {splitted[1]}') except Exception as e: print(Fore.RED + f"Failed to restore file {filed}") open("restore.txt", 'w+').close()
def RestoreItem(obj): winshell.undelete(obj.obj.original_filename()) Beginning(None)
def undelete(sourcePath): winshell.undelete(sourcePath)
#Requirements --- pip install pypiwin32 # pip install winshell import winshell import os try: winshell.recycle_bin().empty(confirm=True, show_progress=True, sound=True) #empty Recycle Bin filepath = os.path.abspath("test.txt") with open(filepath, "w") as f: f.write("testfile1") winshell.delete_file(filepath) #delete a file print(*winshell.recycle_bin().versions(filepath), sep="\n") #versions of file in recycle bin winshell.undelete(filepath) #recovers the latest recycled version except Exception as e: print(str(e))
def RestoreButton(self): if self.currentItemCheck == False: winshell.undelete(self.currentItem.obj.original_filename()) self.setupUi(MainWindow, True)
def FolderUi(self, MainWindow, selected, main, iter, path, lst): # MainWindow = MainW # MainWindow.setWindowFlag(QtCore.Qt.WindowCloseButtonHint, False) self.currentItemCheck = True MainWindow.setObjectName("MainWindow") MainWindow.resize(1200, 700) MainWindow.setMinimumSize(QtCore.QSize(1200, 700)) MainWindow.setMaximumSize(QtCore.QSize(1200, 700)) MainWindow.setStyleSheet("") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(0, 160, 900, 520)) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(4) self.tableWidget.setRowCount(6) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setItem(0, 0, item) self.tableWidget.horizontalHeader().setVisible(False) self.tableWidget.horizontalHeader().setDefaultSectionSize(225) self.tableWidget.verticalHeader().setVisible(False) self.tableWidget.verticalHeader().setDefaultSectionSize(150) self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(0, 0, 1200, 100)) self.label.setStyleSheet( "background-image: url(:/header/images/Untitled-1.png);") self.label.setText("") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(900, 269, 300, 411)) self.label_2.setStyleSheet("\n" "background-color: rgb(212, 212, 212);") self.label_2.setObjectName("label_2") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(940, 120, 200, 50)) self.pushButton.setStyleSheet( "background-image: url(:/header/images/btn-1_3.png);") self.pushButton.setText("") self.pushButton.setCheckable(False) self.pushButton.setAutoDefault(False) self.pushButton.setDefault(False) self.pushButton.setFlat(True) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(940, 190, 200, 50)) self.pushButton_2.setStyleSheet( "background-image: url(:/Buttons/images/btn-2_2.png);") self.pushButton_2.setText("") self.pushButton_2.setFlat(True) self.pushButton_2.setObjectName("pushButton_2") self.line = QtWidgets.QFrame(self.centralwidget) self.line.setGeometry(QtCore.QRect(310, 700, 118, 3)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.line_2 = QtWidgets.QFrame(self.centralwidget) self.line_2.setGeometry(QtCore.QRect(900, 260, 301, 16)) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(0, 100, 901, 71)) self.label_5.setStyleSheet( "\n" "background-image: url(:/pic/images/patti_5.png);") self.label_5.setText("") self.label_5.setObjectName("label_5") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(10, 112, 121, 41)) self.pushButton_3.setStyleSheet( "background-image: url(:/Buttons/images/back_3.png);") self.pushButton_3.setText("") self.pushButton_3.setFlat(True) self.pushButton_3.setObjectName("pushButton_3") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(140, 110, 751, 41)) self.label_6.setStyleSheet("color: rgb(255, 255, 255);\n" "font: 63 14pt \"Segoe UI Semibold\";") self.label_6.setObjectName("label_6") self.label_5.raise_() self.tableWidget.raise_() self.label.raise_() self.label_2.raise_() self.pushButton.raise_() self.pushButton_2.raise_() self.line.raise_() self.line_2.raise_() self.pushButton_3.raise_() self.label_6.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers) _translate = QtCore.QCoreApplication.translate self.label_6.setText( _translate( "MainWindow", "Go Back to Main Window before closing the program, unless the folder will be Restored" )) self.tableWidget.cellClicked.connect(self.FolderCellClicked) self.tableWidget.cellDoubleClicked.connect(self.folderCellDClicked) if iter == False: winshell.undelete(selected.obj.original_filename()) if main == True: self.folderPath = selected.sahiPath self.listOfFolderItems = os.listdir(selected.sahiPath) elif main == False: self.folderPath = path self.listOfFolderItems = os.listdir(path) sizeOfList = len(self.listOfFolderItems) if sizeOfList >= 4: self.tableWidget.setColumnCount(4) self.tableWidget.setRowCount(math.ceil(sizeOfList / 4)) else: self.tableWidget.setColumnCount(sizeOfList) self.tableWidget.setRowCount(1) row = 0 col = 0 for i, v in enumerate(self.listOfFolderItems): col = i % 4 if i != 0 and col == 0: row += 1 ext = v.split(".") if len(ext) == 1: self.FolderCreator(v, row, col) else: self.FileCreator(v, row, col) self.main = main self.selected = selected self.lst = lst self.lstOfParams = [selected, main, iter, path, lst] self.pushButton_3.clicked.connect(self.folderGopBack)
def FileUI(self, MainWindow, cont, selected, main, lst): MainWindow.setObjectName("MainWindow") MainWindow.resize(1200, 700) MainWindow.setMinimumSize(QtCore.QSize(1200, 700)) MainWindow.setMaximumSize(QtCore.QSize(1200, 700)) MainWindow.setStyleSheet("") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(0, 0, 1200, 100)) self.label.setStyleSheet( "background-image: url(:/header/images/Untitled-1.png);") self.label.setText("") self.label.setObjectName("label") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(900, 269, 300, 411)) self.label_2.setStyleSheet("\n" "background-color: rgb(212, 212, 212);") self.label_2.setObjectName("label_2") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(940, 120, 200, 50)) self.pushButton.setStyleSheet( "background-image: url(:/header/images/btn-1_3.png);") self.pushButton.setText("") self.pushButton.setCheckable(False) self.pushButton.setAutoDefault(False) self.pushButton.setDefault(False) self.pushButton.setFlat(True) self.pushButton.setObjectName("pushButton") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(940, 190, 200, 50)) self.pushButton_2.setStyleSheet( "background-image: url(:/Buttons/images/btn-2_2.png);") self.pushButton_2.setText("") self.pushButton_2.setFlat(True) self.pushButton_2.setObjectName("pushButton_2") self.line = QtWidgets.QFrame(self.centralwidget) self.line.setGeometry(QtCore.QRect(310, 700, 118, 3)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.line_2 = QtWidgets.QFrame(self.centralwidget) self.line_2.setGeometry(QtCore.QRect(900, 260, 301, 16)) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(0, 100, 901, 71)) self.label_5.setStyleSheet( "\n" "background-image: url(:/pic/images/patti_5.png);") self.label_5.setText("") self.label_5.setObjectName("label_5") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(10, 118, 121, 41)) self.pushButton_3.setStyleSheet( "background-image: url(:/Buttons/images/back_3.png);") self.pushButton_3.setText("") self.pushButton_3.setFlat(True) self.pushButton_3.setObjectName("pushButton_3") self.label_6 = QtWidgets.QLabel(self.centralwidget) self.label_6.setGeometry(QtCore.QRect(140, 118, 751, 41)) self.label_6.setStyleSheet("color: rgb(255, 255, 255);\n" "font: 63 14pt \"Segoe UI Semibold\";") self.label_6.setObjectName("label_6") self.textEdit = QtWidgets.QTextEdit(self.centralwidget) self.textEdit.setGeometry(QtCore.QRect(0, 170, 900, 520)) self.textEdit.setObjectName("textEdit") self.label_5.raise_() self.label.raise_() self.label_2.raise_() self.pushButton.raise_() self.pushButton_2.raise_() self.line.raise_() self.line_2.raise_() self.pushButton_3.raise_() self.label_6.raise_() self.textEdit.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.textEdit.setReadOnly(True) # self.pushButton_2.clicked.connect(self.RestoreButton) # self.pushButton.clicked.connect(self.DeleteButton) try: self.lst = lst if cont == None: winshell.undelete(selected.obj.original_filename()) file = open(selected.sahiPath, "r") content = file.read() file.close() winshell.delete_file(selected.obj.original_filename()) self.textEdit.setPlainText(content) else: _translate = QtCore.QCoreApplication.translate self.label_6.setText( _translate( "MainWindow", "Go Back to Main Window before closing the program, unless the folder will be Restored" )) self.textEdit.setPlainText(cont) except: self.msgBox("ERROR", "Can't Open This Type of File") if main == True: self.pushButton_3.clicked.connect(self.goBack) else: self.pushButton_3.clicked.connect(self.goCustomBack)
def shred(mode='Basic', path=''): """ The Function shreds files in order to protect the user's identity. :param mode: the shredding mode: Basic, Safe, Complete :param path: the path to be shredded: Recycle Bin or Temporary files :return: None """ start_time = time.perf_counter() failed_shredding = list() if mode == 'Basic': repeat = 1 elif mode == 'Safe': repeat = 5 else: # mode == 'Complete': repeat = 10 if path == 'Let Me Choose': path = random.choice(['Recycle Bin', 'Temporary Files']) executed = False # An auxiliary boolean variable if path == 'Recycle Bin': object_list = list(winshell.recycle_bin()) if object_list: # if list is not empty print(f'Starting Shredding process at {path}\n') executed = True print(f'We are getting ready to shred {len(object_list)} files') time.sleep(1) for index, file_path in enumerate(object_list): for _ in range(repeat): try: success = False file_path = '\\'.join( file_path.original_filename().split('\\') ) # adding double slash (\\) in the file_path # undeleting the selected file winshell.undelete(file_path.original_filename()) if not os.path.isdir(file_path): # is file success = shred_file(file_path) if not success: # if didn't succeed shredding the file failed_shredding.append(file_path) # deleting the selected file again winshell.delete_file(file_path.original_filename()) except: pass if (index + 1) == (len(object_list)): # last file sys.stdout.write( f'\rShredding ({int(((index + 1) / len(object_list)) * 100)}%): {basename(file_path)}last' ) else: sys.stdout.write( f'\rShredding ({int(((index + 1) / len(object_list)) * 100)}%): {basename(file_path)}' ) # Emptying recycle bin. winshell.recycle_bin().empty(confirm=False, show_progress=False, sound=False) print('\nShredding Report:') print( f'Successfully shred: {len(object_list) - len(failed_shredding)} ' f'out of {len(object_list)} Files || Failed to shred : ' f'{len(failed_shredding)} files') finish_time = time.perf_counter() else: print('There are no items in the Recycle Bin to be shredded\n') elif path == 'Temporary Files': directory_path = r'c:\windows\temp' object_list = os.listdir(directory_path) files_list = [] if object_list: while object_list: for file in object_list: file_path = directory_path + file if file_path not in files_list: files_list.append(file_path) object_list.remove(file) print(f'Starting Shredding process at {path}\n') executed = True print(f'We are getting ready to shred {len(files_list)} files') time.sleep(1) for index, file_path in enumerate(files_list): if (index + 1) == len(object_list): # last file sys.stdout.write( f'\rShredding ({int((index / len(files_list)) * 100)}%): {basename(file_path)}last' ) else: sys.stdout.write( f'\rShredding ({int((index / len(files_list)) * 100)}%): {basename(file_path)}' ) for _ in range(repeat): try: if not os.path.isdir(file_path): # is file success = shred_file(file_path) if not success: # if didn't succeed shredding the file failed_shredding.append(file_path) except: pass for file in files_list: os.remove(file) process = subprocess.Popen( 'del /S /Q /F %s\\*.*' % directory_path, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # deleting all temporary files process.communicate() finish_time = time.perf_counter() print('\n\nShredding Report:') print( f'Successfully shredded: {len(files_list) - len(failed_shredding)} ' f'out of {len(files_list)} Files || Failed to shred : ' f'{len(failed_shredding)} files. Deleted: {len(files_list)}') if executed: print( f'Shredding has been finished in {progress_duration(finish_time - start_time)}' ) from Graphic_Interface import display_notifications display_notifications('Shredding process has finished.') else: print( f"""We didn't shred any files since we couldn't find any in {path} """ )