├── LICENSE ├── README.DE.md ├── README.RU.md ├── README.md └── Source ├── Config.ini ├── LangFile.pas ├── Languages ├── Arabic.txt ├── Chinese.txt ├── English.txt ├── French.txt ├── German.txt ├── Italian.txt ├── Japanese.txt ├── Korean.txt ├── Portuguese.txt ├── Russian.txt └── Spanish.txt ├── Project1.dpr ├── Project1.dproj ├── Project1.dres ├── Project1.res ├── Project1.stat ├── Project1Resource.rc ├── Project1_Icon.ico ├── Unit1.dfm ├── Unit1.pas ├── Unit2.dfm ├── Unit2.pas ├── Unit3.dfm ├── Unit3.pas ├── Unit4.dfm ├── Unit4.pas └── clear.bat /LICENSE: -------------------------------------------------------------------------------- 1 | English: 2 | The software, developed technologies and ideas belong to the author and are protected by copyright. Home computer users may use the software at home, "as is", in its current state, free of charge, for personal use, but may not distribute it commercially or use it for commercial purposes without the author's consent. 3 | Commercial and non-commercial organizations may use the software "as is" by making monthly donations, the amount of which is agreed upon with the author, or free of charge by obtaining permission from the author. 4 | Changes to the software can be made to the original repository, but for all other cases the author's permission must be obtained. 5 | 6 | Russian: 7 | Программное обеспечение, разработанные технологии и идеи принадлежат автору и защищены авторским правом. Пользователи домашних компьютеров могут бесплатно использовать программное обеспечение дома, "как есть", в его текущем состоянии, для личных целей, но не имеют права распространять его коммерчески или использовать в коммерческих целях без согласования с автором. 8 | Коммерческие и некоммерческие организации могут использовать программное обеспечение, "как есть", совершая ежемесячные пожертвования, размер которых согласовывается с автором, или бесплатно, получив разрешение от автора. 9 | Изменения в программное обеспечение можно вносить в оригинальный репозиторий, но для всех остальных случаев необходимо получить разрешение автора. 10 | 11 | Chinese (Simplified Chinese): 12 | 软件、开发的技术和想法归作者所有,受版权保护。家庭计算机用户可以在家中免费使用软件“按原样”,但未经作者同意,不得将其商业分发或用于商业目的。 13 | 商业和非商业组织可以通过与作者商定金额的月度捐款或获得作者许可,免费使用“按原样”的软件。 14 | 可以在原始存储库中对软件进行更改,但在其他情况下必须获得作者的许可。 15 | 16 | Spanish: 17 | El software, las tecnologías desarrolladas y las ideas pertenecen al autor y están protegidos por derechos de autor. Los usuarios domésticos de ordenadores pueden utilizar el software en casa, «tal cual», en su estado actual, gratuitamente, para uso personal, pero no pueden distribuirlo comercialmente ni utilizarlo con fines comerciales sin el consentimiento del autor. 18 | Las organizaciones comerciales y no comerciales pueden utilizar el software «tal cual» haciendo donaciones mensuales, cuyo importe se acuerda con el autor, o gratuitamente obteniendo el permiso del autor. 19 | Se pueden realizar cambios en el software en el repositorio original, pero para todos los demás casos debe obtenerse el permiso del autor. 20 | 21 | Portuguese (Brazilian Portuguese): 22 | O software, as tecnologias desenvolvidas e as ideias pertencem ao autor e estão protegidos por direitos autorais. Usuários domésticos podem usar o software em casa, "como está", em seu estado atual, gratuitamente, para uso pessoal, mas não podem distribuí-lo comercialmente ou usá-lo para fins comerciais sem o consentimento do autor. 23 | Organizações comerciais e não comerciais podem usar o software "como está" fazendo doações mensais, cujo valor é acordado com o autor, ou gratuitamente com a permissão do autor. 24 | As alterações no software podem ser feitas no repositório original, mas para todos os outros casos deve-se obter a permissão do autor. 25 | 26 | French: 27 | Le logiciel, les technologies développées et les idées appartiennent à l'auteur et sont protégés par le droit d'auteur. Les utilisateurs d'ordinateurs domestiques peuvent utiliser le logiciel chez eux, « tel quel », dans son état actuel, gratuitement, pour un usage personnel, mais ne peuvent pas le distribuer commercialement ou l'utiliser à des fins commerciales sans l'accord de l'auteur. 28 | Les organisations commerciales et non commerciales peuvent utiliser le logiciel « tel quel » en faisant des dons mensuels, dont le montant est convenu avec l'auteur, ou gratuitement en obtenant l'autorisation de l'auteur. 29 | Les modifications du logiciel peuvent être apportées au dépôt d'origine, mais dans tous les autres cas, l'autorisation de l'auteur doit être obtenue. 30 | 31 | German: 32 | Die Software, die entwickelten Technologien und Ideen gehören dem Autor und sind urheberrechtlich geschützt. Heimcomputerbenutzer dürfen die Software zu Hause „so wie sie ist“, in ihrem aktuellen Zustand, kostenlos für den persönlichen Gebrauch nutzen, dürfen sie aber ohne Zustimmung des Autors nicht kommerziell vertreiben oder für kommerzielle Zwecke nutzen. 33 | Kommerzielle und nicht-kommerzielle Organisationen können die Software „so wie sie ist“ gegen eine monatliche Spende, deren Höhe mit dem Autor vereinbart wird, oder kostenlos mit Erlaubnis des Autors nutzen. 34 | Änderungen an der Software können im ursprünglichen Repository vorgenommen werden, für alle anderen Fälle muss jedoch die Erlaubnis des Autors eingeholt werden. 35 | 36 | Japanese: 37 | 本ソフトウェア、開発された技術およびアイデアは作者に帰属し、著作権により保護されています。家庭用コンピュータのユーザーは、個人的な使用のために、ソフトウェアを「現状のまま」、無料で使用することができますが、著者の同意なしに商業的に配布したり、商業目的で使用したりすることはできません。 38 | 営利団体および非営利団体は、作者と合意した金額を毎月寄付するか、作者の許可を得ることにより、ソフトウェアを「現状のまま」無償で使用することができます。 39 | ソフトウェアの変更はオリジナルのリポジトリに対して行うことができますが、それ以外の場合は作者の許可を得る必要があります。 40 | 41 | Arabic: 42 | البرنامج والتقنيات والأفكار المطورة تعود للمؤلف وهي محمية بحقوق الطبع والنشر. يمكن لمستخدمي أجهزة الكمبيوتر المنزلية استخدام البرنامج في المنزل "كما هو" في حالته الحالية مجانًا للاستخدام الشخصي، ولكن لا يمكنهم توزيعه تجاريًا أو استخدامه لأغراض تجارية دون موافقة المؤلف. 43 | يمكن للمنظمات التجارية وغير التجارية استخدام البرنامج "كما هو" من خلال التبرعات الشهرية، التي يتم الاتفاق على قيمتها مع المؤلف، أو مجانًا بالحصول على إذن المؤلف. 44 | يمكن إجراء التغييرات على البرنامج في المستودع الأصلي، ولكن في جميع الحالات الأخرى يجب الحصول على إذن المؤلف. 45 | 46 | Italian: 47 | Il software, le tecnologie sviluppate e le idee appartengono all'autore e sono protetti da copyright. Gli utenti domestici possono utilizzare il software a casa, "così com'è", nel suo stato attuale, gratuitamente, per uso personale, ma non possono distribuirlo commercialmente o utilizzarlo per scopi commerciali senza il consenso dell'autore. 48 | Le organizzazioni commerciali e non commerciali possono utilizzare il software "così com'è" effettuando donazioni mensili, il cui importo è concordato con l'autore, o gratuitamente con il permesso dell'autore. 49 | Le modifiche al software possono essere apportate nel repository originale, ma per tutti gli altri casi è necessario ottenere il permesso dell'autore. 50 | 51 | Korean: 52 | 소프트웨어, 개발된 기술 및 아이디어는 저작권에 의해 보호되며 저작권은 저자에게 있습니다. 가정용 컴퓨터 사용자는 소프트웨어를 현재 상태 그대로 무료로 개인용으로 사용할 수 있지만, 저자의 동의 없이 상업적으로 배포하거나 상업적 목적으로 사용할 수 없습니다. 53 | 상업 및 비상업 조직은 저자와 합의한 금액의 월 기부를 통해 또는 저자의 허가를 받아 무료로 소프트웨어를 "있는 그대로" 사용할 수 있습니다. 54 | 소프트웨어의 변경은 원래의 저장소에서 이루어질 수 있지만, 그 외의 경우에는 저자의 허가를 받아야 합니다. -------------------------------------------------------------------------------- /README.DE.md: -------------------------------------------------------------------------------- 1 | [![EN](https://user-images.githubusercontent.com/9499881/33184537-7be87e86-d096-11e7-89bb-f3286f752bc6.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.md) 2 | [![RU](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.RU.md) 3 | [![DE](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260246889-6c5b3633-6c6d-48d2-a054-d6d9e1017394.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.DE.md) 4 | 5 | # EchoBackuper 6 | Anwendung für Backups. Backups werden nach dem Echo-Prinzip erstellt. Neue und aktualisierte Dateien werden vom Originalordner in das Backup kopiert. Das Umbenennen, Verschieben und Löschen von Dateien erfolgt nur im Backup. 7 | 8 | 9 | Folgende Sprachen werden unterstützt: Englisch, Russisch, Chinesisch (traditionell), Spanisch, Portugiesisch (brasilianisches Portugiesisch), Französisch, Deutsch, Japanisch, Arabisch, Italienisch und Koreanisch. 10 | 11 | ![flag-united-kingdom](https://github.com/user-attachments/assets/8c03c9b8-d154-466f-b9c4-6ea60278d537) 12 | ![flag-russia](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png) 13 | ![flag-china](https://github.com/user-attachments/assets/16848591-2baf-4300-893b-b95d5249a34e) 14 | ![flag-spanish](https://github.com/user-attachments/assets/a892b7ce-d83f-4914-9c54-9ba16c9c9e38) 15 | ![flag-brazil](https://github.com/user-attachments/assets/f2544579-81df-43b4-94c5-59c569828182) 16 | ![flag-french](https://github.com/user-attachments/assets/57f54331-32a3-4146-823c-4aa85a4c6669) 17 | ![flag-germany](https://github.com/user-attachments/assets/11066aa3-7c0d-4507-9df1-cad00fe53fad) 18 | ![flag-japan](https://github.com/user-attachments/assets/37cfc183-4de7-4d5a-a698-0da1286a6ee1) 19 | ![flag-egypt](https://github.com/user-attachments/assets/44399d0f-f05f-4d44-a4ab-13b6d7ded087) 20 | ![flag-saudi-arabia](https://github.com/user-attachments/assets/07d7d133-5a21-4bde-8c37-c1ef3772ac91) 21 | ![flag-united-arab-emirates](https://github.com/user-attachments/assets/81d3b610-a2f4-44c9-b2ad-20e4d7cfb2b2) 22 | ![flag-italy](https://github.com/user-attachments/assets/692490d6-bc53-446f-99b8-bf2becb8ec0d) 23 | ![flag-north-korea](https://github.com/user-attachments/assets/5b315a3d-6ce0-4cbb-b7a3-133ef2bcb2c5) 24 | ![flag-south-korea](https://github.com/user-attachments/assets/ed3d3778-9193-444a-85fd-ac5dd7bc91c6) 25 | 26 | ## Silent Mode 27 | >EchoBackuper.exe -b "BackupPaths.ebp" -s 28 | 29 | `-b backup_ext_hdd.ebp` - Eine andere Liste von Paar- und Ausschlussordnern laden. Die „ebp“-Dateien werden im Programm selbst erstellt. 30 | 31 | `-s` - ller Modus mit abschließender Benachrichtigung. Für Benachrichtigungen müssen Sie die Anwendung [Notifications](https://github.com/r57zone/notifications) herunterladen, unter „Programme“ (Program Files) entpacken und führen Sie es einmal aus. 32 | 33 | ![](https://user-images.githubusercontent.com/9499881/65593964-b96af000-dfa2-11e9-814b-bf03625359a5.png) 34 | 35 | ## Screenshots 36 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224440-d6362d7c-3cf0-47d2-9aaf-6b3b7d823b75.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/a42082e5-e67e-4640-8484-a253eda65329) 37 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224456-38066115-c0ba-445d-9ded-86bb98de617c.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/b973da26-7da7-4c2b-b6a4-9dccf418c8a8) 38 | 39 | ## Download 40 | >Version für Windows 7, 8.1, 10, 11. 41 | 42 | **[Download](https://github.com/r57zone/EchoBackuper/releases)** 43 | 44 | ## Feedback 45 | `r57zone[at]gmail.com` -------------------------------------------------------------------------------- /README.RU.md: -------------------------------------------------------------------------------- 1 | [![EN](https://user-images.githubusercontent.com/9499881/33184537-7be87e86-d096-11e7-89bb-f3286f752bc6.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.md) 2 | [![RU](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.RU.md) 3 | [![DE](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260246889-6c5b3633-6c6d-48d2-a054-d6d9e1017394.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.DE.md) 4 | 5 | # EchoBackuper 6 | Приложение для создания резервных копий. Резервные копии создаются по принципу эха. Новые и обновлённые файлы копируются из оригинальной папки в резервную копию. Переименование, перемещение и удаление файлов происходит только в резервной копии. 7 | 8 | 9 | Поддерживаются следующие языки: английский, русский, китайский (традиционный), испанский, португальский (бразильский португальский), французский, немецкий, японский, арабский, итальянский и корейский. 10 | 11 | ![flag-united-kingdom](https://github.com/user-attachments/assets/8c03c9b8-d154-466f-b9c4-6ea60278d537) 12 | ![flag-russia](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png) 13 | ![flag-china](https://github.com/user-attachments/assets/16848591-2baf-4300-893b-b95d5249a34e) 14 | ![flag-spanish](https://github.com/user-attachments/assets/a892b7ce-d83f-4914-9c54-9ba16c9c9e38) 15 | ![flag-brazil](https://github.com/user-attachments/assets/f2544579-81df-43b4-94c5-59c569828182) 16 | ![flag-french](https://github.com/user-attachments/assets/57f54331-32a3-4146-823c-4aa85a4c6669) 17 | ![flag-germany](https://github.com/user-attachments/assets/11066aa3-7c0d-4507-9df1-cad00fe53fad) 18 | ![flag-japan](https://github.com/user-attachments/assets/37cfc183-4de7-4d5a-a698-0da1286a6ee1) 19 | ![flag-egypt](https://github.com/user-attachments/assets/44399d0f-f05f-4d44-a4ab-13b6d7ded087) 20 | ![flag-saudi-arabia](https://github.com/user-attachments/assets/07d7d133-5a21-4bde-8c37-c1ef3772ac91) 21 | ![flag-united-arab-emirates](https://github.com/user-attachments/assets/81d3b610-a2f4-44c9-b2ad-20e4d7cfb2b2) 22 | ![flag-italy](https://github.com/user-attachments/assets/692490d6-bc53-446f-99b8-bf2becb8ec0d) 23 | ![flag-north-korea](https://github.com/user-attachments/assets/5b315a3d-6ce0-4cbb-b7a3-133ef2bcb2c5) 24 | ![flag-south-korea](https://github.com/user-attachments/assets/ed3d3778-9193-444a-85fd-ac5dd7bc91c6) 25 | 26 | ## Тихий режим 27 | >EchoBackuper.exe -b "BackupPaths.ebp" -s 28 | 29 | `-b backup_ext_hdd.ebp` - загрузка иного списка связанных и исключенных папок. Файлы формата "ebp" создаются в самой программе. 30 | 31 | `-s` - тихий режим с финальном уведомлением. Для уведомлений нужно загрузить приложение [Уведомления](https://github.com/r57zone/notifications), распаковать в "Program Files" и запустите 1 раз. 32 | 33 | ![](https://user-images.githubusercontent.com/9499881/65593028-c4bd1c00-dfa0-11e9-8baf-9f3bc571933e.png) 34 | 35 | ## Скриншоты 36 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224551-28062e0d-e4dd-49cf-a4a6-ed5d2b61f5e7.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/20ba3b9b-1cc0-477c-bd5b-1c7624104a06) 37 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224561-2ddde940-ca38-49de-af7f-fcf313da8f2e.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/d2803032-ff6b-47d1-a2a0-246dc1bcb35e) 38 | 39 | ## Загрузка 40 | >Версия для Windows 7, 8.1, 10, 11. 41 | 42 | **[Загрузить](https://github.com/r57zone/EchoBackuper/releases)** 43 | 44 | ## Обратная связь 45 | `r57zone[собака]gmail.com` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![EN](https://user-images.githubusercontent.com/9499881/33184537-7be87e86-d096-11e7-89bb-f3286f752bc6.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.md) 2 | [![RU](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.RU.md) 3 | [![DE](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260246889-6c5b3633-6c6d-48d2-a054-d6d9e1017394.png)](https://github.com/r57zone/EchoBackuper/blob/master/README.DE.md) 4 | ← Choose language | Выберите язык | Wählen Sie eine Sprache aus 5 | 6 | # EchoBackuper 7 | Application for backups. Backups are created using the echo principle. New and updated files are copied from the original folder to the backup. Renaming, moving and deleting files occurs only in the backup. 8 | 9 | 10 | The following languages ​​are supported: English, Russian, Chinese (Traditional), Spanish, Portuguese (Brazilian Portuguese), French, German, Japanese, Arabic, Italian and Korean. 11 | 12 | ![flag-united-kingdom](https://github.com/user-attachments/assets/8c03c9b8-d154-466f-b9c4-6ea60278d537) 13 | ![flag-russia](https://user-images.githubusercontent.com/9499881/27683795-5b0fbac6-5cd8-11e7-929c-057833e01fb1.png) 14 | ![flag-china](https://github.com/user-attachments/assets/16848591-2baf-4300-893b-b95d5249a34e) 15 | ![flag-spanish](https://github.com/user-attachments/assets/a892b7ce-d83f-4914-9c54-9ba16c9c9e38) 16 | ![flag-brazil](https://github.com/user-attachments/assets/f2544579-81df-43b4-94c5-59c569828182) 17 | ![flag-french](https://github.com/user-attachments/assets/57f54331-32a3-4146-823c-4aa85a4c6669) 18 | ![flag-germany](https://github.com/user-attachments/assets/11066aa3-7c0d-4507-9df1-cad00fe53fad) 19 | ![flag-japan](https://github.com/user-attachments/assets/37cfc183-4de7-4d5a-a698-0da1286a6ee1) 20 | ![flag-egypt](https://github.com/user-attachments/assets/44399d0f-f05f-4d44-a4ab-13b6d7ded087) 21 | ![flag-saudi-arabia](https://github.com/user-attachments/assets/07d7d133-5a21-4bde-8c37-c1ef3772ac91) 22 | ![flag-united-arab-emirates](https://github.com/user-attachments/assets/81d3b610-a2f4-44c9-b2ad-20e4d7cfb2b2) 23 | ![flag-italy](https://github.com/user-attachments/assets/692490d6-bc53-446f-99b8-bf2becb8ec0d) 24 | ![flag-north-korea](https://github.com/user-attachments/assets/5b315a3d-6ce0-4cbb-b7a3-133ef2bcb2c5) 25 | ![flag-south-korea](https://github.com/user-attachments/assets/ed3d3778-9193-444a-85fd-ac5dd7bc91c6) 26 | 27 | ## Silent Mode 28 | >EchoBackuper.exe -b "BackupPaths.ebp" -s 29 | 30 | `-b backup_ext_hdd.ebp` - load a different list of pair and exclude folders. The "ebp" files are created in the program itself. 31 | 32 | `-s` - silent mode with final notification. For notifications need to download the application [Notifications](https://github.com/r57zone/notifications), unpack to "Program Files" and run 1 time. 33 | 34 | ![](https://user-images.githubusercontent.com/9499881/65593964-b96af000-dfa2-11e9-814b-bf03625359a5.png) 35 | 36 | ## Screenshots 37 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224440-d6362d7c-3cf0-47d2-9aaf-6b3b7d823b75.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/a42082e5-e67e-4640-8484-a253eda65329) 38 | [![](https://github-production-user-asset-6210df.s3.amazonaws.com/9499881/260224456-38066115-c0ba-445d-9ded-86bb98de617c.jpg)](https://github.com/r57zone/EchoBackuper/assets/9499881/b973da26-7da7-4c2b-b6a4-9dccf418c8a8) 39 | 40 | ## Download 41 | >Version for Windows 7, 8.1, 10, 11. 42 | 43 | **[Download](https://github.com/r57zone/EchoBackuper/releases)** 44 | 45 | ## Feedback 46 | `r57zone[at]gmail.com` -------------------------------------------------------------------------------- /Source/Config.ini: -------------------------------------------------------------------------------- 1 | [Main] 2 | LookTasks=1 3 | CRCCopyCheck=0 4 | WriteCreationDate=0 5 | WriteAttributes=0 6 | -------------------------------------------------------------------------------- /Source/LangFile.pas: -------------------------------------------------------------------------------- 1 | unit LangFile; 2 | 3 | interface 4 | 5 | uses 6 | Classes, SysUtils, Generics.Collections; 7 | 8 | type 9 | TLangFile = class 10 | private 11 | FCache: TDictionary; 12 | public 13 | constructor Create(const FileName: string); 14 | destructor Destroy; override; 15 | function GetString(const Key, DefaultValue: string): string; 16 | end; 17 | 18 | implementation 19 | 20 | constructor TLangFile.Create(const FileName: string); 21 | var 22 | LangFile: TStringList; 23 | i, PosEqual: Integer; 24 | Key, Value: string; 25 | begin 26 | FCache := TDictionary.Create; 27 | LangFile := TStringList.Create; 28 | if not FileExists(FileName) then Exit; 29 | try 30 | LangFile.LoadFromFile(FileName, TEncoding.UTF8); 31 | for i := 0 to LangFile.Count - 1 do 32 | begin 33 | PosEqual := Pos('=', LangFile[i]); 34 | if PosEqual <> 0 then 35 | begin 36 | Key := Trim(Copy(LangFile[i], 1, PosEqual - 1)); 37 | Value := Trim(Copy(LangFile[i], PosEqual + 1, MaxInt)); 38 | FCache.Add(Key, Value); 39 | end; 40 | end; 41 | finally 42 | LangFile.Free; 43 | end; 44 | end; 45 | 46 | destructor TLangFile.Destroy; 47 | begin 48 | FCache.Free; 49 | inherited; 50 | end; 51 | 52 | function TLangFile.GetString(const Key, DefaultValue: string): string; 53 | begin 54 | if not FCache.TryGetValue(Key, Result) then 55 | Result := DefaultValue; 56 | end; 57 | 58 | end. 59 | 60 | -------------------------------------------------------------------------------- /Source/Languages/Arabic.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=نشط 3 | NAME=الاسم 4 | LEFT_FOLDER=المجلد الأيسر 5 | RIGHT_FOLDER=المجلد الأيمن 6 | REM_SELECTION=إلغاء التحديد 7 | SELECT_ALL=اختيار الكل 8 | MOVE=نقل 9 | UP=أعلى 10 | DOWN=أسفل 11 | RUN=تشغيل 12 | FILE=ملف 13 | CREATE=إنشاء 14 | OPEN=فتح 15 | EXIT=خروج 16 | FOLDERS=المجلدات 17 | ADD=إضافة 18 | EDIT=تعديل 19 | REMOVE=إزالة 20 | EXCLUDE=استبعاد 21 | STOP=إيقاف 22 | ALL_OPERATIONS=جميع العمليات: 23 | CURRENT_OPERATION=العملية الحالية: 24 | HELP=مساعدة 25 | FILE_DIALOG_FILTER=مسارات النسخ الاحتياطي|*.ebp 26 | 27 | # Settings 28 | SETTINGS=الإعدادات 29 | VIEW_TASKS=عرض المهام قبل العمليات 30 | CHECKSUM_VERIFICATION_COPY=التحقق من المجموع الاختباري بعد النسخ 31 | COPY_CREATION_DATE=الحفاظ على تاريخ إنشاء الملفات عند النسخ 32 | COPY_FILE_ATTRIBUTES=الحفاظ على سمات الملفات عند النسخ 33 | 34 | # Statuses 35 | LOOKING_CHANGES=البحث عن التغييرات في 36 | FILE_RENAMED=تم إعادة تسمية الملف: 37 | FOUND_NEW_FILE=تم العثور على ملف جديد: 38 | FILE_UPDATED=تم تحديث الملف: 39 | FOUND_OLD_FILE=تم العثور على ملف قديم: 40 | COPY_FILE=تم نسخ الملف: 41 | MOVE_FILE=تم نقل الملف: 42 | RENAME_FILE=تم إعادة تسمية الملف: 43 | REMOVE_FILE=تم حذف الملف: 44 | CREATE_FOLDER=تم إنشاء المجلد: 45 | REMOVE_FOLDER=تم حذف المجلد: 46 | CHECK_MOVE_FILES=التحقق من الملفات للنقل... 47 | 48 | COMPLETED=مكتمل 49 | COMPLETED_ERROR=مكتمل مع أخطاء 50 | BACKUP_COMPLETED=تم إتمام النسخ الاحتياطي بنجاح. 51 | BACKUP_FAILED=حدثت مشكلة أثناء إنشاء النسخ الاحتياطي. 52 | CHECK_FILES=الملفات التي تم فحصها: 53 | TOTAL_OPERATIONS=إجمالي العمليات: 54 | SUCCESS_COPY_FILES=الملفات المنسوخة بنجاح: 55 | SUCCESS_MOVE_FILES=الملفات المنقولة بنجاح: 56 | SUCCESS_RENAME_FILES=الملفات المعاد تسميتها بنجاح: 57 | SUCCESS_REMOVE_FILES=الملفات المحذوفة بنجاح: 58 | SUCCESS_CREATE_FOLDERS=المجلدات المنشأة بنجاح: 59 | SUCCESS_REMOVE_FOLDERS=المجلدات المحذوفة بنجاح: 60 | FAIL_COPY_FILES=فشل في نسخ الملفات: 61 | FAIL_MOVE_FILES=فشل في نقل الملفات: 62 | FAIL_RENAME_FILES=فشل في إعادة تسمية الملفات: 63 | FAIL_REMOVE_FILES=فشل في حذف الملفات: 64 | FAIL_CREATE_FOLDERS=فشل في إنشاء المجلدات: 65 | FAIL_REMOVE_FOLDERS=فشل في حذف المجلدات: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=هل تريد تنفيذ العمليات؟ 69 | ENTER_NAME_PAIR_FOLDERS=أدخل اسم المجلدين المرتبطين: 70 | CHOOSE_LEFT_FOLDER=اختر المجلد الأيسر 71 | CHOOSE_RIGHT_FOLDER=اختر المجلد الأيمن 72 | CHOOSE_FOLDER_ERROR=تم اختيار المجلدات بشكل غير صحيح 73 | SUCCESS_NOTIFICATION_MESSAGE=تم إتمام النسخ الاحتياطي بنجاح 74 | FAIL_NOTIFICATION_MESSAGE=تم إتمام النسخ الاحتياطي مع أخطاء 75 | 76 | # About 77 | ABOUT_TITLE=حول البرنامج... 78 | LAST_UPDATE=آخر تحديث: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=المجلدات المستبعدة 82 | SELECT_EXCLUDE_FOLDER=اختر المجلد للاستبعاد 83 | OK=موافق 84 | CANCEL=إلغاء 85 | 86 | # Logs 87 | SAVE_AS=حفظ باسم... 88 | LOGS_FILE_DIALOG_FILTER=ملفات الدُفعات (*.bat)|*.bat|ملفات نصية (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=هل تريد إضافة أمر "pause" إلى الملف؟ 90 | -------------------------------------------------------------------------------- /Source/Languages/Chinese.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=激活 3 | NAME=名称 4 | LEFT_FOLDER=左侧文件夹 5 | RIGHT_FOLDER=右侧文件夹 6 | REM_SELECTION=取消选择 7 | SELECT_ALL=选择全部 8 | MOVE=移动 9 | UP=向上 10 | DOWN=向下 11 | RUN=运行 12 | FILE=文件 13 | CREATE=创建 14 | OPEN=打开 15 | EXIT=退出 16 | FOLDERS=文件夹 17 | ADD=添加 18 | EDIT=编辑 19 | REMOVE=删除 20 | EXCLUDE=排除 21 | STOP=停止 22 | ALL_OPERATIONS=所有操作: 23 | CURRENT_OPERATION=当前操作: 24 | HELP=帮助 25 | FILE_DIALOG_FILTER=备份路径|*.ebp 26 | 27 | # Settings 28 | SETTINGS=设置 29 | VIEW_TASKS=操作前查看任务 30 | CHECKSUM_VERIFICATION_COPY=复制后校验校验和 31 | COPY_CREATION_DATE=复制时保留文件创建日期 32 | COPY_FILE_ATTRIBUTES=复制时保留文件属性 33 | 34 | # Statuses 35 | LOOKING_CHANGES=正在查找更改 36 | FILE_RENAMED=文件已重命名: 37 | FOUND_NEW_FILE=发现新文件: 38 | FILE_UPDATED=文件已更新: 39 | FOUND_OLD_FILE=发现旧文件: 40 | COPY_FILE=文件正在复制: 41 | MOVE_FILE=文件正在移动: 42 | RENAME_FILE=文件正在重命名: 43 | REMOVE_FILE=文件正在删除: 44 | CREATE_FOLDER=文件夹正在创建: 45 | REMOVE_FOLDER=文件夹正在删除: 46 | CHECK_MOVE_FILES=正在检查文件以便移动... 47 | 48 | COMPLETED=完成 49 | COMPLETED_ERROR=完成,出现错误 50 | BACKUP_COMPLETED=备份成功完成。 51 | BACKUP_FAILED=备份时出现问题。 52 | CHECK_FILES=已检查文件: 53 | TOTAL_OPERATIONS=操作总数: 54 | SUCCESS_COPY_FILES=成功复制的文件: 55 | SUCCESS_MOVE_FILES=成功移动的文件: 56 | SUCCESS_RENAME_FILES=成功重命名的文件: 57 | SUCCESS_REMOVE_FILES=成功删除的文件: 58 | SUCCESS_CREATE_FOLDERS=成功创建的文件夹: 59 | SUCCESS_REMOVE_FOLDERS=成功删除的文件夹: 60 | FAIL_COPY_FILES=复制文件失败: 61 | FAIL_MOVE_FILES=移动文件失败: 62 | FAIL_RENAME_FILES=重命名文件失败: 63 | FAIL_REMOVE_FILES=删除文件失败: 64 | FAIL_CREATE_FOLDERS=创建文件夹失败: 65 | FAIL_REMOVE_FOLDERS=删除文件夹失败: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=执行操作? 69 | ENTER_NAME_PAIR_FOLDERS=输入关联文件夹的名称: 70 | CHOOSE_LEFT_FOLDER=选择左侧文件夹 71 | CHOOSE_RIGHT_FOLDER=选择右侧文件夹 72 | CHOOSE_FOLDER_ERROR=选择的文件夹不正确 73 | SUCCESS_NOTIFICATION_MESSAGE=备份成功完成 74 | FAIL_NOTIFICATION_MESSAGE=备份完成,出现错误 75 | 76 | # About 77 | ABOUT_TITLE=关于程序... 78 | LAST_UPDATE=最后更新: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=排除的文件夹 82 | SELECT_EXCLUDE_FOLDER=选择要排除的文件夹 83 | OK=确定 84 | CANCEL=取消 85 | 86 | # Logs 87 | SAVE_AS=另存为... 88 | LOGS_FILE_DIALOG_FILTER=批处理文件 (*.bat)|*.bat|文本文件 (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=在文件中添加“暂停”命令? 90 | -------------------------------------------------------------------------------- /Source/Languages/English.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Active 3 | NAME=Name 4 | LEFT_FOLDER=Left Folder 5 | RIGHT_FOLDER=Right Folder 6 | REM_SELECTION=Remove Selection 7 | SELECT_ALL=Select All 8 | MOVE=Move 9 | UP=Up 10 | DOWN=Down 11 | RUN=Run 12 | FILE=File 13 | CREATE=Create 14 | OPEN=Open 15 | EXIT=Exit 16 | FOLDERS=Folders 17 | ADD=Add 18 | EDIT=Edit 19 | REMOVE=Remove 20 | EXCLUDE=Exclude 21 | STOP=Stop 22 | ALL_OPERATIONS=All Operations: 23 | CURRENT_OPERATION=Current Operation: 24 | HELP=Help 25 | FILE_DIALOG_FILTER=Backup Paths|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Settings 29 | VIEW_TASKS=View Tasks Before Operations 30 | CHECKSUM_VERIFICATION_COPY=Checksum Verification After Copy 31 | COPY_CREATION_DATE=Preserve File Creation Date When Copying 32 | COPY_FILE_ATTRIBUTES=Preserve File Attributes When Copying 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Searching for Changes in 36 | FILE_RENAMED=File Renamed: 37 | FOUND_NEW_FILE=Found New File: 38 | FILE_UPDATED=File Updated: 39 | FOUND_OLD_FILE=Found Old File: 40 | COPY_FILE=File is being copied: 41 | MOVE_FILE=File is being moved: 42 | RENAME_FILE=File is being renamed: 43 | REMOVE_FILE=File is being removed: 44 | CREATE_FOLDER=Folder is being created: 45 | REMOVE_FOLDER=Folder is being removed: 46 | CHECK_MOVE_FILES=Checking files for moving... 47 | 48 | COMPLETED=Completed 49 | COMPLETED_ERROR=Completed with Errors 50 | BACKUP_COMPLETED=Backup successfully completed. 51 | BACKUP_FAILED=There were problems creating the backup. 52 | CHECK_FILES=Files checked: 53 | TOTAL_OPERATIONS=Total operations: 54 | SUCCESS_COPY_FILES=Files successfully copied: 55 | SUCCESS_MOVE_FILES=Files successfully moved: 56 | SUCCESS_RENAME_FILES=Files successfully renamed: 57 | SUCCESS_REMOVE_FILES=Files successfully removed: 58 | SUCCESS_CREATE_FOLDERS=Folders successfully created: 59 | SUCCESS_REMOVE_FOLDERS=Folders successfully removed: 60 | FAIL_COPY_FILES=Failed to copy files: 61 | FAIL_MOVE_FILES=Failed to move files: 62 | FAIL_RENAME_FILES=Failed to rename files: 63 | FAIL_REMOVE_FILES=Failed to remove files: 64 | FAIL_CREATE_FOLDERS=Failed to create folders: 65 | FAIL_REMOVE_FOLDERS=Failed to remove folders: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Perform operations? 69 | ENTER_NAME_PAIR_FOLDERS=Enter the name for linked folders: 70 | CHOOSE_LEFT_FOLDER=Choose left folder 71 | CHOOSE_RIGHT_FOLDER=Choose right folder 72 | CHOOSE_FOLDER_ERROR=Incorrect folders selected 73 | SUCCESS_NOTIFICATION_MESSAGE=Backup successfully completed 74 | FAIL_NOTIFICATION_MESSAGE=Backup completed with errors 75 | 76 | # About 77 | ABOUT_TITLE=About the program... 78 | LAST_UPDATE=Last update: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Excluded folders 82 | SELECT_EXCLUDE_FOLDER=Select folder to exclude 83 | OK=OK 84 | CANCEL=Cancel 85 | 86 | # Logs 87 | SAVE_AS=Save As... 88 | LOGS_FILE_DIALOG_FILTER=Batch files (*.bat)|*.bat|Text files (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=Add "pause" command to file? 90 | -------------------------------------------------------------------------------- /Source/Languages/French.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Actif 3 | NAME=Nom 4 | LEFT_FOLDER=Dossier gauche 5 | RIGHT_FOLDER=Dossier droit 6 | REM_SELECTION=Retirer la sélection 7 | SELECT_ALL=Tout sélectionner 8 | MOVE=Déplacer 9 | UP=Haut 10 | DOWN=Bas 11 | RUN=Lancer 12 | FILE=Fichier 13 | CREATE=Créer 14 | OPEN=Ouvrir 15 | EXIT=Quitter 16 | FOLDERS=Dossiers 17 | ADD=Ajouter 18 | EDIT=Modifier 19 | REMOVE=Supprimer 20 | EXCLUDE=Exclure 21 | STOP=Arrêter 22 | ALL_OPERATIONS=Toutes les opérations : 23 | CURRENT_OPERATION=Opération en cours : 24 | HELP=Aide 25 | FILE_DIALOG_FILTER=Chemins de sauvegarde|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Paramètres 29 | VIEW_TASKS=Voir les tâches avant les opérations 30 | CHECKSUM_VERIFICATION_COPY=Vérification de la somme de contrôle après la copie 31 | COPY_CREATION_DATE=Conserver la date de création des fichiers lors de la copie 32 | COPY_FILE_ATTRIBUTES=Conserver les attributs des fichiers lors de la copie 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Recherche de modifications dans 36 | FILE_RENAMED=Fichier renommé : 37 | FOUND_NEW_FILE=Fichier nouveau trouvé : 38 | FILE_UPDATED=Fichier mis à jour : 39 | FOUND_OLD_FILE=Fichier ancien trouvé : 40 | COPY_FILE=Le fichier est copié : 41 | MOVE_FILE=Le fichier est déplacé : 42 | RENAME_FILE=Le fichier est renommé : 43 | REMOVE_FILE=Le fichier est supprimé : 44 | CREATE_FOLDER=Le dossier est créé : 45 | REMOVE_FOLDER=Le dossier est supprimé : 46 | CHECK_MOVE_FILES=Vérification des fichiers pour déplacement... 47 | 48 | COMPLETED=Terminé 49 | COMPLETED_ERROR=Terminé avec des erreurs 50 | BACKUP_COMPLETED=La sauvegarde a été terminée avec succès. 51 | BACKUP_FAILED=Des problèmes sont survenus lors de la création de la sauvegarde. 52 | CHECK_FILES=Fichiers vérifiés : 53 | TOTAL_OPERATIONS=Opérations totales : 54 | SUCCESS_COPY_FILES=Fichiers copiés avec succès : 55 | SUCCESS_MOVE_FILES=Fichiers déplacés avec succès : 56 | SUCCESS_RENAME_FILES=Fichiers renommés avec succès : 57 | SUCCESS_REMOVE_FILES=Fichiers supprimés avec succès : 58 | SUCCESS_CREATE_FOLDERS=Dossiers créés avec succès : 59 | SUCCESS_REMOVE_FOLDERS=Dossiers supprimés avec succès : 60 | FAIL_COPY_FILES=Échec de la copie des fichiers : 61 | FAIL_MOVE_FILES=Échec du déplacement des fichiers : 62 | FAIL_RENAME_FILES=Échec du renommage des fichiers : 63 | FAIL_REMOVE_FILES=Échec de la suppression des fichiers : 64 | FAIL_CREATE_FOLDERS=Échec de la création des dossiers : 65 | FAIL_REMOVE_FOLDERS=Échec de la suppression des dossiers : 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Exécuter les opérations ? 69 | ENTER_NAME_PAIR_FOLDERS=Entrez le nom des dossiers liés : 70 | CHOOSE_LEFT_FOLDER=Sélectionner le dossier gauche 71 | CHOOSE_RIGHT_FOLDER=Sélectionner le dossier droit 72 | CHOOSE_FOLDER_ERROR=Dossiers sélectionnés incorrects 73 | SUCCESS_NOTIFICATION_MESSAGE=Sauvegarde terminée avec succès 74 | FAIL_NOTIFICATION_MESSAGE=Sauvegarde terminée avec des erreurs 75 | 76 | # About 77 | ABOUT_TITLE=À propos du programme... 78 | LAST_UPDATE=Dernière mise à jour : 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Dossiers exclus 82 | SELECT_EXCLUDE_FOLDER=Sélectionner le dossier à exclure 83 | OK=D'accord 84 | CANCEL=Annuler 85 | 86 | # Logs 87 | SAVE_AS=Enregistrer sous... 88 | LOGS_FILE_DIALOG_FILTER=Fichiers batch (*.bat)|*.bat|Fichiers texte (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=Ajouter la commande "pause" au fichier ? 90 | -------------------------------------------------------------------------------- /Source/Languages/German.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Aktiv 3 | NAME=Name 4 | LEFT_FOLDER=Linker Ordner 5 | RIGHT_FOLDER=Rechter Ordner 6 | REM_SELECTION=Auswahl entfernen 7 | SELECT_ALL=Alle auswählen 8 | MOVE=Verschieben 9 | UP=Nach oben 10 | DOWN=Nach unten 11 | RUN=Starten 12 | FILE=Datei 13 | CREATE=Erstellen 14 | OPEN=Öffnen 15 | EXIT=Beenden 16 | FOLDERS=Ordner 17 | ADD=Hinzufügen 18 | EDIT=Bearbeiten 19 | REMOVE=Entfernen 20 | EXCLUDE=Ausnehmen 21 | STOP=Stoppen 22 | ALL_OPERATIONS=Alle Operationen: 23 | CURRENT_OPERATION=Aktuelle Operation: 24 | HELP=Hilfe 25 | FILE_DIALOG_FILTER=Sicherungs-Pfade|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Einstellungen 29 | VIEW_TASKS=Aufgaben vor den Operationen anzeigen 30 | CHECKSUM_VERIFICATION_COPY=Prüfziffer nach dem Kopieren überprüfen 31 | COPY_CREATION_DATE=Erstellungsdatum der Dateien beim Kopieren beibehalten 32 | COPY_FILE_ATTRIBUTES=Dateiattribute beim Kopieren beibehalten 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Suche nach Änderungen in 36 | FILE_RENAMED=Datei umbenannt: 37 | FOUND_NEW_FILE=Neue Datei gefunden: 38 | FILE_UPDATED=Datei aktualisiert: 39 | FOUND_OLD_FILE=Alte Datei gefunden: 40 | COPY_FILE=Datei wird kopiert: 41 | MOVE_FILE=Datei wird verschoben: 42 | RENAME_FILE=Datei wird umbenannt: 43 | REMOVE_FILE=Datei wird gelöscht: 44 | CREATE_FOLDER=Ordner wird erstellt: 45 | REMOVE_FOLDER=Ordner wird gelöscht: 46 | CHECK_MOVE_FILES=Überprüfe Dateien auf Verschiebung... 47 | 48 | COMPLETED=Abgeschlossen 49 | COMPLETED_ERROR=Abgeschlossen mit Fehlern 50 | BACKUP_COMPLETED=Backup erfolgreich abgeschlossen. 51 | BACKUP_FAILED=Fehler beim Erstellen des Backups. 52 | CHECK_FILES=Überprüfte Dateien: 53 | TOTAL_OPERATIONS=Gesamtanzahl der Operationen: 54 | SUCCESS_COPY_FILES=Erfolgreich kopierte Dateien: 55 | SUCCESS_MOVE_FILES=Erfolgreich verschobene Dateien: 56 | SUCCESS_RENAME_FILES=Erfolgreich umbenannte Dateien: 57 | SUCCESS_REMOVE_FILES=Erfolgreich entfernte Dateien: 58 | SUCCESS_CREATE_FOLDERS=Erfolgreich erstellte Ordner: 59 | SUCCESS_REMOVE_FOLDERS=Erfolgreich entfernte Ordner: 60 | FAIL_COPY_FILES=Fehler beim Kopieren der Dateien: 61 | FAIL_MOVE_FILES=Fehler beim Verschieben der Dateien: 62 | FAIL_RENAME_FILES=Fehler beim Umbenennen der Dateien: 63 | FAIL_REMOVE_FILES=Fehler beim Entfernen der Dateien: 64 | FAIL_CREATE_FOLDERS=Fehler beim Erstellen der Ordner: 65 | FAIL_REMOVE_FOLDERS=Fehler beim Entfernen der Ordner: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Operationen ausführen? 69 | ENTER_NAME_PAIR_FOLDERS=Geben Sie den Namen der verknüpften Ordner ein: 70 | CHOOSE_LEFT_FOLDER=Wählen Sie den linken Ordner 71 | CHOOSE_RIGHT_FOLDER=Wählen Sie den rechten Ordner 72 | CHOOSE_FOLDER_ERROR=Falsche Ordner ausgewählt 73 | SUCCESS_NOTIFICATION_MESSAGE=Backup erfolgreich abgeschlossen 74 | FAIL_NOTIFICATION_MESSAGE=Backup abgeschlossen mit Fehlern 75 | 76 | # About 77 | ABOUT_TITLE=Über das Programm... 78 | LAST_UPDATE=Letzte Aktualisierung: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Ausgeschlossene Ordner 82 | SELECT_EXCLUDE_FOLDER=Ordner zum Ausschließen auswählen 83 | OK=OK 84 | CANCEL=Abbrechen 85 | 86 | # Logs 87 | SAVE_AS=Speichern unter... 88 | LOGS_FILE_DIALOG_FILTER=Batch-Dateien (*.bat)|*.bat|Textdateien (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=„Pause“-Befehl zur Datei hinzufügen? 90 | -------------------------------------------------------------------------------- /Source/Languages/Italian.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Attivo 3 | NAME=Nome 4 | LEFT_FOLDER=Cartella sinistra 5 | RIGHT_FOLDER=Cartella destra 6 | REM_SELECTION=Rimuovi selezione 7 | SELECT_ALL=Seleziona tutto 8 | MOVE=Sposta 9 | UP=Sopra 10 | DOWN=Sotto 11 | RUN=Avvia 12 | FILE=File 13 | CREATE=Crea 14 | OPEN=Apri 15 | EXIT=Esci 16 | FOLDERS=Cartelle 17 | ADD=Aggiungi 18 | EDIT=Modifica 19 | REMOVE=Rimuovi 20 | EXCLUDE=Escludi 21 | STOP=Ferma 22 | ALL_OPERATIONS=Tutte le operazioni: 23 | CURRENT_OPERATION=Operazione corrente: 24 | HELP=Aiuto 25 | FILE_DIALOG_FILTER=Percorsi di backup|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Impostazioni 29 | VIEW_TASKS=Visualizza le attività prima delle operazioni 30 | CHECKSUM_VERIFICATION_COPY=Verifica la somma di controllo dopo la copia 31 | COPY_CREATION_DATE=Conserva la data di creazione dei file durante la copia 32 | COPY_FILE_ATTRIBUTES=Conserva gli attributi dei file durante la copia 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Cerca modifiche in 36 | FILE_RENAMED=File rinominato: 37 | FOUND_NEW_FILE=Nuovo file trovato: 38 | FILE_UPDATED=File aggiornato: 39 | FOUND_OLD_FILE=Vecchio file trovato: 40 | COPY_FILE=Il file è copiato: 41 | MOVE_FILE=Il file è spostato: 42 | RENAME_FILE=Il file è rinominato: 43 | REMOVE_FILE=Il file è rimosso: 44 | CREATE_FOLDER=La cartella è creata: 45 | REMOVE_FOLDER=La cartella è rimossa: 46 | CHECK_MOVE_FILES=Controllo dei file per lo spostamento... 47 | 48 | COMPLETED=Completato 49 | COMPLETED_ERROR=Completato con errori 50 | BACKUP_COMPLETED=Il backup è stato completato con successo. 51 | BACKUP_FAILED=Si sono verificati problemi durante la creazione del backup. 52 | CHECK_FILES=File controllati: 53 | TOTAL_OPERATIONS=Operazioni totali: 54 | SUCCESS_COPY_FILES=File copiati con successo: 55 | SUCCESS_MOVE_FILES=File spostati con successo: 56 | SUCCESS_RENAME_FILES=File rinominati con successo: 57 | SUCCESS_REMOVE_FILES=File rimossi con successo: 58 | SUCCESS_CREATE_FOLDERS=Cartelle create con successo: 59 | SUCCESS_REMOVE_FOLDERS=Cartelle rimosse con successo: 60 | FAIL_COPY_FILES=Impossibile copiare i file: 61 | FAIL_MOVE_FILES=Impossibile spostare i file: 62 | FAIL_RENAME_FILES=Impossibile rinominare i file: 63 | FAIL_REMOVE_FILES=Impossibile rimuovere i file: 64 | FAIL_CREATE_FOLDERS=Impossibile creare le cartelle: 65 | FAIL_REMOVE_FOLDERS=Impossibile rimuovere le cartelle: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Eseguire le operazioni? 69 | ENTER_NAME_PAIR_FOLDERS=Inserisci il nome delle cartelle correlate: 70 | CHOOSE_LEFT_FOLDER=Scegli la cartella sinistra 71 | CHOOSE_RIGHT_FOLDER=Scegli la cartella destra 72 | CHOOSE_FOLDER_ERROR=Cartelle selezionate in modo errato 73 | SUCCESS_NOTIFICATION_MESSAGE=Backup completato con successo 74 | FAIL_NOTIFICATION_MESSAGE=Backup completato con errori 75 | 76 | # About 77 | ABOUT_TITLE=Informazioni sul programma... 78 | LAST_UPDATE=Ultimo aggiornamento: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Cartelle escluse 82 | SELECT_EXCLUDE_FOLDER=Scegli una cartella da escludere 83 | OK=OK 84 | CANCEL=Annulla 85 | 86 | # Logs 87 | SAVE_AS=Salva con nome... 88 | LOGS_FILE_DIALOG_FILTER=File batch (*.bat)|*.bat|File di testo (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=Aggiungere il comando "pause" al file? 90 | -------------------------------------------------------------------------------- /Source/Languages/Japanese.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=アクティブ 3 | NAME=名前 4 | LEFT_FOLDER=左フォルダ 5 | RIGHT_FOLDER=右フォルダ 6 | REM_SELECTION=選択解除 7 | SELECT_ALL=すべて選択 8 | MOVE=移動 9 | UP=上 10 | DOWN=下 11 | RUN=実行 12 | FILE=ファイル 13 | CREATE=作成 14 | OPEN=開く 15 | EXIT=終了 16 | FOLDERS=フォルダ 17 | ADD=追加 18 | EDIT=編集 19 | REMOVE=削除 20 | EXCLUDE=除外 21 | STOP=停止 22 | ALL_OPERATIONS=すべての操作: 23 | CURRENT_OPERATION=現在の操作: 24 | HELP=ヘルプ 25 | FILE_DIALOG_FILTER=バックアップパス|*.ebp 26 | 27 | # Settings 28 | SETTINGS=設定 29 | VIEW_TASKS=操作前にタスクを表示 30 | CHECKSUM_VERIFICATION_COPY=コピー後のチェックサム確認 31 | COPY_CREATION_DATE=コピー時にファイルの作成日を保持 32 | COPY_FILE_ATTRIBUTES=コピー時にファイル属性を保持 33 | 34 | # Statuses 35 | LOOKING_CHANGES=変更を検索中: 36 | FILE_RENAMED=ファイル名変更: 37 | FOUND_NEW_FILE=新しいファイルが見つかりました: 38 | FILE_UPDATED=ファイルが更新されました: 39 | FOUND_OLD_FILE=古いファイルが見つかりました: 40 | COPY_FILE=ファイルがコピーされました: 41 | MOVE_FILE=ファイルが移動されました: 42 | RENAME_FILE=ファイル名が変更されました: 43 | REMOVE_FILE=ファイルが削除されました: 44 | CREATE_FOLDER=フォルダが作成されました: 45 | REMOVE_FOLDER=フォルダが削除されました: 46 | CHECK_MOVE_FILES=移動するファイルを確認中... 47 | 48 | COMPLETED=完了 49 | COMPLETED_ERROR=エラーで完了 50 | BACKUP_COMPLETED=バックアップの作成が正常に完了しました。 51 | BACKUP_FAILED=バックアップ作成中に問題が発生しました。 52 | CHECK_FILES=チェックしたファイル数: 53 | TOTAL_OPERATIONS=総操作数: 54 | SUCCESS_COPY_FILES=正常にコピーされたファイル数: 55 | SUCCESS_MOVE_FILES=正常に移動されたファイル数: 56 | SUCCESS_RENAME_FILES=正常に名前変更されたファイル数: 57 | SUCCESS_REMOVE_FILES=正常に削除されたファイル数: 58 | SUCCESS_CREATE_FOLDERS=正常に作成されたフォルダ数: 59 | SUCCESS_REMOVE_FOLDERS=正常に削除されたフォルダ数: 60 | FAIL_COPY_FILES=コピーに失敗したファイル数: 61 | FAIL_MOVE_FILES=移動に失敗したファイル数: 62 | FAIL_RENAME_FILES=名前変更に失敗したファイル数: 63 | FAIL_REMOVE_FILES=削除に失敗したファイル数: 64 | FAIL_CREATE_FOLDERS=作成に失敗したフォルダ数: 65 | FAIL_REMOVE_FOLDERS=削除に失敗したフォルダ数: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=操作を実行しますか? 69 | ENTER_NAME_PAIR_FOLDERS=関連するフォルダ名を入力してください: 70 | CHOOSE_LEFT_FOLDER=左のフォルダを選択 71 | CHOOSE_RIGHT_FOLDER=右のフォルダを選択 72 | CHOOSE_FOLDER_ERROR=フォルダの選択が誤っています 73 | SUCCESS_NOTIFICATION_MESSAGE=バックアップが正常に完了しました 74 | FAIL_NOTIFICATION_MESSAGE=バックアップがエラーで完了しました 75 | 76 | # About 77 | ABOUT_TITLE=プログラムについて... 78 | LAST_UPDATE=最終更新日: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=除外されたフォルダ 82 | SELECT_EXCLUDE_FOLDER=除外するフォルダを選択 83 | OK=OK 84 | CANCEL=キャンセル 85 | 86 | # Logs 87 | SAVE_AS=名前を付けて保存... 88 | LOGS_FILE_DIALOG_FILTER=バッチファイル (*.bat)|*.bat|テキストファイル (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE="pause" コマンドをファイルに追加しますか? 90 | -------------------------------------------------------------------------------- /Source/Languages/Korean.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=활성 3 | NAME=이름 4 | LEFT_FOLDER=왼쪽 폴더 5 | RIGHT_FOLDER=오른쪽 폴더 6 | REM_SELECTION=선택 취소 7 | SELECT_ALL=모두 선택 8 | MOVE=이동 9 | UP=위로 10 | DOWN=아래로 11 | RUN=실행 12 | FILE=파일 13 | CREATE=생성 14 | OPEN=열기 15 | EXIT=종료 16 | FOLDERS=폴더 17 | ADD=추가 18 | EDIT=편집 19 | REMOVE=삭제 20 | EXCLUDE=제외 21 | STOP=중지 22 | ALL_OPERATIONS=모든 작업: 23 | CURRENT_OPERATION=현재 작업: 24 | HELP=도움말 25 | FILE_DIALOG_FILTER=백업 경로|*.ebp 26 | 27 | # Settings 28 | SETTINGS=설정 29 | VIEW_TASKS=작업 실행 전 작업 보기 30 | CHECKSUM_VERIFICATION_COPY=복사 후 체크섬 확인 31 | COPY_CREATION_DATE=복사 시 파일 생성 날짜 유지 32 | COPY_FILE_ATTRIBUTES=복사 시 파일 속성 유지 33 | 34 | # Statuses 35 | LOOKING_CHANGES=변경 사항 검색 중: 36 | FILE_RENAMED=파일 이름 변경됨: 37 | FOUND_NEW_FILE=새로운 파일이 발견됨: 38 | FILE_UPDATED=파일이 업데이트됨: 39 | FOUND_OLD_FILE=오래된 파일이 발견됨: 40 | COPY_FILE=파일이 복사됨: 41 | MOVE_FILE=파일이 이동됨: 42 | RENAME_FILE=파일 이름이 변경됨: 43 | REMOVE_FILE=파일이 삭제됨: 44 | CREATE_FOLDER=폴더가 생성됨: 45 | REMOVE_FOLDER=폴더가 삭제됨: 46 | CHECK_MOVE_FILES=이동할 파일 확인 중... 47 | 48 | COMPLETED=완료 49 | COMPLETED_ERROR=오류로 완료됨 50 | BACKUP_COMPLETED=백업 생성이 성공적으로 완료됨. 51 | BACKUP_FAILED=백업 생성 중 문제가 발생함. 52 | CHECK_FILES=검사된 파일 수: 53 | TOTAL_OPERATIONS=총 작업 수: 54 | SUCCESS_COPY_FILES=성공적으로 복사된 파일 수: 55 | SUCCESS_MOVE_FILES=성공적으로 이동된 파일 수: 56 | SUCCESS_RENAME_FILES=성공적으로 이름 변경된 파일 수: 57 | SUCCESS_REMOVE_FILES=성공적으로 삭제된 파일 수: 58 | SUCCESS_CREATE_FOLDERS=성공적으로 생성된 폴더 수: 59 | SUCCESS_REMOVE_FOLDERS=성공적으로 삭제된 폴더 수: 60 | FAIL_COPY_FILES=복사에 실패한 파일 수: 61 | FAIL_MOVE_FILES=이동에 실패한 파일 수: 62 | FAIL_RENAME_FILES=이름 변경에 실패한 파일 수: 63 | FAIL_REMOVE_FILES=삭제에 실패한 파일 수: 64 | FAIL_CREATE_FOLDERS=폴더 생성에 실패한 수: 65 | FAIL_REMOVE_FOLDERS=폴더 삭제에 실패한 수: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=작업을 실행하시겠습니까? 69 | ENTER_NAME_PAIR_FOLDERS=연결된 폴더 이름을 입력하십시오: 70 | CHOOSE_LEFT_FOLDER=왼쪽 폴더 선택 71 | CHOOSE_RIGHT_FOLDER=오른쪽 폴더 선택 72 | CHOOSE_FOLDER_ERROR=잘못된 폴더 선택 73 | SUCCESS_NOTIFICATION_MESSAGE=백업이 성공적으로 완료됨 74 | FAIL_NOTIFICATION_MESSAGE=백업이 오류로 완료됨 75 | 76 | # About 77 | ABOUT_TITLE=프로그램 정보... 78 | LAST_UPDATE=마지막 업데이트: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=제외된 폴더 82 | SELECT_EXCLUDE_FOLDER=제외할 폴더 선택 83 | OK=확인 84 | CANCEL=취소 85 | 86 | # Logs 87 | SAVE_AS=다른 이름으로 저장... 88 | LOGS_FILE_DIALOG_FILTER=배치 파일 (*.bat)|*.bat|텍스트 파일 (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE="pause" 명령어를 파일에 추가하시겠습니까? 90 | -------------------------------------------------------------------------------- /Source/Languages/Portuguese.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Ativo 3 | NAME=Nome 4 | LEFT_FOLDER=Pasta esquerda 5 | RIGHT_FOLDER=Pasta direita 6 | REM_SELECTION=Remover seleção 7 | SELECT_ALL=Selecionar tudo 8 | MOVE=Mover 9 | UP=Cima 10 | DOWN=Baixo 11 | RUN=Executar 12 | FILE=Arquivo 13 | CREATE=Criar 14 | OPEN=Abrir 15 | EXIT=Sair 16 | FOLDERS=Pastas 17 | ADD=Adicionar 18 | EDIT=Editar 19 | REMOVE=Remover 20 | EXCLUDE=Excluir 21 | STOP=Parar 22 | ALL_OPERATIONS=Todas as operações: 23 | CURRENT_OPERATION=Operação atual: 24 | HELP=Ajuda 25 | FILE_DIALOG_FILTER=Caminhos de backup|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Configurações 29 | VIEW_TASKS=Exibir tarefas antes das operações 30 | CHECKSUM_VERIFICATION_COPY=Verificação de soma de verificação após a cópia 31 | COPY_CREATION_DATE=Manter data de criação dos arquivos ao copiar 32 | COPY_FILE_ATTRIBUTES=Manter atributos de arquivos ao copiar 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Procurando alterações em 36 | FILE_RENAMED=Arquivo renomeado: 37 | FOUND_NEW_FILE=Novo arquivo encontrado: 38 | FILE_UPDATED=Arquivo atualizado: 39 | FOUND_OLD_FILE=Arquivo antigo encontrado: 40 | COPY_FILE=Arquivo copiado: 41 | MOVE_FILE=Arquivo movido: 42 | RENAME_FILE=Arquivo renomeado: 43 | REMOVE_FILE=Arquivo removido: 44 | CREATE_FOLDER=Pasta criada: 45 | REMOVE_FOLDER=Pasta removida: 46 | CHECK_MOVE_FILES=Verificando arquivos para mover... 47 | 48 | COMPLETED=Concluído 49 | COMPLETED_ERROR=Concluído com erros 50 | BACKUP_COMPLETED=Backup concluído com sucesso. 51 | BACKUP_FAILED=Ocorreu um problema ao criar o backup. 52 | CHECK_FILES=Arquivos verificados: 53 | TOTAL_OPERATIONS=Operações totais: 54 | SUCCESS_COPY_FILES=Arquivos copiados com sucesso: 55 | SUCCESS_MOVE_FILES=Arquivos movidos com sucesso: 56 | SUCCESS_RENAME_FILES=Arquivos renomeados com sucesso: 57 | SUCCESS_REMOVE_FILES=Arquivos removidos com sucesso: 58 | SUCCESS_CREATE_FOLDERS=Pastas criadas com sucesso: 59 | SUCCESS_REMOVE_FOLDERS=Pastas removidas com sucesso: 60 | FAIL_COPY_FILES=Falha ao copiar arquivos: 61 | FAIL_MOVE_FILES=Falha ao mover arquivos: 62 | FAIL_RENAME_FILES=Falha ao renomear arquivos: 63 | FAIL_REMOVE_FILES=Falha ao remover arquivos: 64 | FAIL_CREATE_FOLDERS=Falha ao criar pastas: 65 | FAIL_REMOVE_FOLDERS=Falha ao remover pastas: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Executar as operações? 69 | ENTER_NAME_PAIR_FOLDERS=Digite o nome das pastas associadas: 70 | CHOOSE_LEFT_FOLDER=Escolha a pasta esquerda 71 | CHOOSE_RIGHT_FOLDER=Escolha a pasta direita 72 | CHOOSE_FOLDER_ERROR=Pasta selecionada incorretamente 73 | SUCCESS_NOTIFICATION_MESSAGE=Backup concluído com sucesso 74 | FAIL_NOTIFICATION_MESSAGE=Backup concluído com erro 75 | 76 | # About 77 | ABOUT_TITLE=Sobre o programa... 78 | LAST_UPDATE=Última atualização: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Pastas excluídas 82 | SELECT_EXCLUDE_FOLDER=Selecione a pasta para excluir 83 | OK=OK 84 | CANCEL=Cancelar 85 | 86 | # Logs 87 | SAVE_AS=Salvar como... 88 | LOGS_FILE_DIALOG_FILTER=Arquivos em lote (*.bat)|*.bat|Arquivos de texto (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=Adicionar o comando "pause" ao arquivo? 90 | -------------------------------------------------------------------------------- /Source/Languages/Russian.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Активный 3 | NAME=Имя 4 | LEFT_FOLDER=Левая папка 5 | RIGHT_FOLDER=Правая папка 6 | REM_SELECTION=Снять выделение 7 | SELECT_ALL=Выбрать все 8 | MOVE=Переместить 9 | UP=Выше 10 | DOWN=Ниже 11 | RUN=Запустить 12 | FILE=Файл 13 | CREATE=Создать 14 | OPEN=Открыть 15 | EXIT=Выход 16 | FOLDERS=Папки 17 | ADD=Добавить 18 | EDIT=Изменить 19 | REMOVE=Удалить 20 | EXCLUDE=Исключить 21 | STOP=Остановить 22 | ALL_OPERATIONS=Все операции: 23 | CURRENT_OPERATION=Текущая операция: 24 | HELP=Справка 25 | FILE_DIALOG_FILTER=Пути резервных копий|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Настройки 29 | VIEW_TASKS=Просмотр задач перед операциями 30 | CHECKSUM_VERIFICATION_COPY=Проверка контрольной суммы после копирования 31 | COPY_CREATION_DATE=Сохранять дату создания файлов при копировании 32 | COPY_FILE_ATTRIBUTES=Сохранять атрибуты файлов при копировании 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Ищем изменения в 36 | FILE_RENAMED=Файл переименован: 37 | FOUND_NEW_FILE=Найден новый файл: 38 | FILE_UPDATED=Файл обновлен: 39 | FOUND_OLD_FILE=Найден старый файл: 40 | COPY_FILE=Идёт копирование файла: 41 | MOVE_FILE=Идёт перемещение файла: 42 | RENAME_FILE=Идёт переименование файла: 43 | REMOVE_FILE=Идёт удаление файла: 44 | CREATE_FOLDER=Идёт создание папки: 45 | REMOVE_FOLDER=Идёт удаление папки: 46 | CHECK_MOVE_FILES=Проверка файлов на перемещение... 47 | 48 | COMPLETED=Завершено 49 | COMPLETED_ERROR=Завершено с ошибками 50 | BACKUP_COMPLETED=Создание резервной копии успешно завершено. 51 | BACKUP_FAILED=При создании резервной копии возникли проблемы. 52 | CHECK_FILES=Проверено файлов: 53 | TOTAL_OPERATIONS=Всего операций: 54 | SUCCESS_COPY_FILES=Успешно скопированных файлов: 55 | SUCCESS_MOVE_FILES=Успешно перемещённых файлов: 56 | SUCCESS_RENAME_FILES=Успешно переименованных файлов: 57 | SUCCESS_REMOVE_FILES=Успешно удаленных файлов: 58 | SUCCESS_CREATE_FOLDERS=Успешно созданных папок: 59 | SUCCESS_REMOVE_FOLDERS=Успешно удалённых папок: 60 | FAIL_COPY_FILES=Не удалось скопировать файлов: 61 | FAIL_MOVE_FILES=Не удалось переместить файлов: 62 | FAIL_RENAME_FILES=Не удалось переименовать файлов: 63 | FAIL_REMOVE_FILES=Не удалось удалить файлов: 64 | FAIL_CREATE_FOLDERS=Не удалось создать папок: 65 | FAIL_REMOVE_FOLDERS=Не удалось удалить папок: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=Выполнить операции? 69 | ENTER_NAME_PAIR_FOLDERS=Введите имя связанных папок: 70 | CHOOSE_LEFT_FOLDER=Выберите левую папку 71 | CHOOSE_RIGHT_FOLDER=Выберите правую папку 72 | CHOOSE_FOLDER_ERROR=Неверно выбраны папки 73 | SUCCESS_NOTIFICATION_MESSAGE=Резерв. копир. усп. завершено 74 | FAIL_NOTIFICATION_MESSAGE=Резерв. копир. завершено с ошиб. 75 | 76 | # About 77 | ABOUT_TITLE=О программе... 78 | LAST_UPDATE=Последнее обновление: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Исключенные папки 82 | SELECT_EXCLUDE_FOLDER=Выберите папку для исключения 83 | OK=ОК 84 | CANCEL=Отмена 85 | 86 | # Logs 87 | SAVE_AS=Сохранить как... 88 | LOGS_FILE_DIALOG_FILTER=Пакетные файлы (*.bat)|*.bat|Текстовые файлы (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=Добавить команду "pause" в файл? -------------------------------------------------------------------------------- /Source/Languages/Spanish.txt: -------------------------------------------------------------------------------- 1 | # Main 2 | ACTIVE=Activo 3 | NAME=Nombre 4 | LEFT_FOLDER=Carpeta izquierda 5 | RIGHT_FOLDER=Carpeta derecha 6 | REM_SELECTION=Desmarcar selección 7 | SELECT_ALL=Seleccionar todo 8 | MOVE=Mover 9 | UP=Arriba 10 | DOWN=Abajo 11 | RUN=Ejecutar 12 | FILE=Archivo 13 | CREATE=Crear 14 | OPEN=Abrir 15 | EXIT=Salir 16 | FOLDERS=Carpetas 17 | ADD=Agregar 18 | EDIT=Editar 19 | REMOVE=Eliminar 20 | EXCLUDE=Excluir 21 | STOP=Detener 22 | ALL_OPERATIONS=Todas las operaciones: 23 | CURRENT_OPERATION=Operación actual: 24 | HELP=Ayuda 25 | FILE_DIALOG_FILTER=Rutas de copia de seguridad|*.ebp 26 | 27 | # Settings 28 | SETTINGS=Configuraciones 29 | VIEW_TASKS=Ver tareas antes de las operaciones 30 | CHECKSUM_VERIFICATION_COPY=Verificación de suma de comprobación después de copiar 31 | COPY_CREATION_DATE=Mantener la fecha de creación de los archivos al copiar 32 | COPY_FILE_ATTRIBUTES=Mantener los atributos de los archivos al copiar 33 | 34 | # Statuses 35 | LOOKING_CHANGES=Buscando cambios en 36 | FILE_RENAMED=Archivo renombrado: 37 | FOUND_NEW_FILE=Nuevo archivo encontrado: 38 | FILE_UPDATED=Archivo actualizado: 39 | FOUND_OLD_FILE=Archivo antiguo encontrado: 40 | COPY_FILE=Archivo copiado: 41 | MOVE_FILE=Archivo movido: 42 | RENAME_FILE=Archivo renombrado: 43 | REMOVE_FILE=Archivo eliminado: 44 | CREATE_FOLDER=Carpeta creada: 45 | REMOVE_FOLDER=Carpeta eliminada: 46 | CHECK_MOVE_FILES=Comprobando archivos para mover... 47 | 48 | COMPLETED=Completado 49 | COMPLETED_ERROR=Completado con errores 50 | BACKUP_COMPLETED=La copia de seguridad se completó con éxito. 51 | BACKUP_FAILED=Hubo problemas al crear la copia de seguridad. 52 | CHECK_FILES=Archivos verificados: 53 | TOTAL_OPERATIONS=Operaciones totales: 54 | SUCCESS_COPY_FILES=Archivos copiados con éxito: 55 | SUCCESS_MOVE_FILES=Archivos movidos con éxito: 56 | SUCCESS_RENAME_FILES=Archivos renombrados con éxito: 57 | SUCCESS_REMOVE_FILES=Archivos eliminados con éxito: 58 | SUCCESS_CREATE_FOLDERS=Carpetas creadas con éxito: 59 | SUCCESS_REMOVE_FOLDERS=Carpetas eliminadas con éxito: 60 | FAIL_COPY_FILES=Falló al copiar archivos: 61 | FAIL_MOVE_FILES=Falló al mover archivos: 62 | FAIL_RENAME_FILES=Falló al renombrar archivos: 63 | FAIL_REMOVE_FILES=Falló al eliminar archivos: 64 | FAIL_CREATE_FOLDERS=Falló al crear carpetas: 65 | FAIL_REMOVE_FOLDERS=Falló al eliminar carpetas: 66 | 67 | # Messages 68 | PERFORM_OPERATIONS=¿Ejecutar las operaciones? 69 | ENTER_NAME_PAIR_FOLDERS=Ingrese el nombre de las carpetas asociadas: 70 | CHOOSE_LEFT_FOLDER=Seleccione la carpeta izquierda 71 | CHOOSE_RIGHT_FOLDER=Seleccione la carpeta derecha 72 | CHOOSE_FOLDER_ERROR=Carpeta seleccionada incorrectamente 73 | SUCCESS_NOTIFICATION_MESSAGE=Copia de seguridad completada con éxito 74 | FAIL_NOTIFICATION_MESSAGE=Copia de seguridad completada con errores 75 | 76 | # About 77 | ABOUT_TITLE=Acerca del programa... 78 | LAST_UPDATE=Última actualización: 79 | 80 | # ExcludeFolder 81 | EXCLUDE_TITLE=Carpetas excluidas 82 | SELECT_EXCLUDE_FOLDER=Seleccione la carpeta para excluir 83 | OK=OK 84 | CANCEL=Cancelar 85 | 86 | # Logs 87 | SAVE_AS=Guardar como... 88 | LOGS_FILE_DIALOG_FILTER=Archivos por lotes (*.bat)|*.bat|Archivos de texto (*.txt)|*.txt 89 | ADD_PAUSE_TO_FILE=¿Agregar el comando "pause" al archivo? 90 | -------------------------------------------------------------------------------- /Source/Project1.dpr: -------------------------------------------------------------------------------- 1 | program Project1; 2 | 3 | {$R *.dres} 4 | 5 | uses 6 | Vcl.Forms, 7 | Unit1 in 'Unit1.pas' {Main}, 8 | Unit2 in 'Unit2.pas' {ExcludeFoldersForm}, 9 | Unit3 in 'Unit3.pas' {LogsForm}, 10 | Unit4 in 'Unit4.pas' {Settings}; 11 | 12 | {$R *.res} 13 | 14 | begin 15 | Application.Initialize; 16 | Application.MainFormOnTaskbar := True; 17 | Application.CreateForm(TMain, Main); 18 | Application.CreateForm(TExcludeFoldersForm, ExcludeFoldersForm); 19 | Application.CreateForm(TLogsForm, LogsForm); 20 | Application.CreateForm(TSettings, Settings); 21 | Application.Run; 22 | end. 23 | -------------------------------------------------------------------------------- /Source/Project1.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {BDAEF3FB-DE22-480B-913A-DE52B2071C21} 4 | 19.5 5 | VCL 6 | Project1.dpr 7 | True 8 | Release 9 | Win32 10 | 1 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | .\$(Platform)\$(Config) 50 | .\$(Platform)\$(Config) 51 | false 52 | false 53 | false 54 | false 55 | false 56 | RESTComponents;FireDAC;FireDACSqliteDriver;soaprtl;FireDACIBDriver;soapmidas;FireDACCommon;RESTBackendComponents;soapserver;CloudService;FireDACCommonDriver;inet;$(DCC_UsePackage) 57 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 58 | $(BDS)\bin\delphi_PROJECTICON.ico 59 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 60 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 61 | Project1 62 | 63 | 64 | DBXSqliteDriver;IndyIPCommon;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;svnui;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;vcltouch;vcldb;bindcompfmx;svn;FireDACPgDriver;inetdb;DbxCommonDriver;fmx;fmxdae;xmlrtl;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;IndyIPClient;bindcompvcl;VCLRESTComponents;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;fmxase;$(DCC_UsePackage) 65 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 66 | Debug 67 | true 68 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 69 | 1033 70 | $(BDS)\bin\default_app.manifest 71 | 72 | 73 | DBXSqliteDriver;IndyIPCommon;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;tethering;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;vcltouch;vcldb;bindcompfmx;FireDACPgDriver;inetdb;DbxCommonDriver;fmx;fmxdae;xmlrtl;fmxobj;vclwinx;rtl;DbxClientDriver;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;IndyIPClient;bindcompvcl;VCLRESTComponents;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;fmxase;$(DCC_UsePackage) 74 | 75 | 76 | DEBUG;$(DCC_Define) 77 | true 78 | false 79 | true 80 | true 81 | true 82 | 83 | 84 | false 85 | true 86 | false 87 | true 88 | true 89 | 1033 90 | PerMonitor 91 | 92 | 93 | false 94 | RELEASE;$(DCC_Define) 95 | 0 96 | 0 97 | 98 | 99 | true 100 | 1033 101 | Project1_Icon.ico 102 | PerMonitor 103 | CompanyName=;FileDescription=EchoBackuper;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.r57zone.echobackuper;ProductName=EchoBackuper;ProductVersion=1.0.0.0;Comments= 104 | 105 | 106 | 107 | MainSource 108 | 109 | 110 |
Main
111 | dfm 112 |
113 | 114 |
ExcludeFoldersForm
115 | dfm 116 |
117 | 118 |
LogsForm
119 | dfm 120 |
121 | 122 |
Settings
123 | dfm 124 |
125 | 126 | ICON 127 | MainIcon 128 | 129 | 130 | Base 131 | 132 | 133 | Cfg_1 134 | Base 135 | 136 | 137 | Cfg_2 138 | Base 139 | 140 |
141 | 142 | Delphi.Personality.12 143 | Application 144 | 145 | 146 | 147 | Project1.dpr 148 | 149 | 150 | Microsoft Office 2000 Sample Automation Server Wrapper Components 151 | Microsoft Office XP Sample Automation Server Wrapper Components 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | .\ 160 | true 161 | 162 | 163 | 164 | 165 | 166 | 167 | Project1.exe 168 | true 169 | 170 | 171 | 172 | 173 | 1 174 | 175 | 176 | Contents\MacOS 177 | 1 178 | 179 | 180 | 0 181 | 182 | 183 | 184 | 185 | classes 186 | 64 187 | 188 | 189 | classes 190 | 64 191 | 192 | 193 | 194 | 195 | res\xml 196 | 1 197 | 198 | 199 | res\xml 200 | 1 201 | 202 | 203 | 204 | 205 | library\lib\armeabi-v7a 206 | 1 207 | 208 | 209 | 210 | 211 | library\lib\armeabi 212 | 1 213 | 214 | 215 | library\lib\armeabi 216 | 1 217 | 218 | 219 | 220 | 221 | library\lib\armeabi-v7a 222 | 1 223 | 224 | 225 | 226 | 227 | library\lib\mips 228 | 1 229 | 230 | 231 | library\lib\mips 232 | 1 233 | 234 | 235 | 236 | 237 | library\lib\armeabi-v7a 238 | 1 239 | 240 | 241 | library\lib\arm64-v8a 242 | 1 243 | 244 | 245 | 246 | 247 | library\lib\armeabi-v7a 248 | 1 249 | 250 | 251 | 252 | 253 | res\drawable 254 | 1 255 | 256 | 257 | res\drawable 258 | 1 259 | 260 | 261 | 262 | 263 | res\values 264 | 1 265 | 266 | 267 | res\values 268 | 1 269 | 270 | 271 | 272 | 273 | res\values-v21 274 | 1 275 | 276 | 277 | res\values-v21 278 | 1 279 | 280 | 281 | 282 | 283 | res\values 284 | 1 285 | 286 | 287 | res\values 288 | 1 289 | 290 | 291 | 292 | 293 | res\drawable 294 | 1 295 | 296 | 297 | res\drawable 298 | 1 299 | 300 | 301 | 302 | 303 | res\drawable-xxhdpi 304 | 1 305 | 306 | 307 | res\drawable-xxhdpi 308 | 1 309 | 310 | 311 | 312 | 313 | res\drawable-xxxhdpi 314 | 1 315 | 316 | 317 | res\drawable-xxxhdpi 318 | 1 319 | 320 | 321 | 322 | 323 | res\drawable-ldpi 324 | 1 325 | 326 | 327 | res\drawable-ldpi 328 | 1 329 | 330 | 331 | 332 | 333 | res\drawable-mdpi 334 | 1 335 | 336 | 337 | res\drawable-mdpi 338 | 1 339 | 340 | 341 | 342 | 343 | res\drawable-hdpi 344 | 1 345 | 346 | 347 | res\drawable-hdpi 348 | 1 349 | 350 | 351 | 352 | 353 | res\drawable-xhdpi 354 | 1 355 | 356 | 357 | res\drawable-xhdpi 358 | 1 359 | 360 | 361 | 362 | 363 | res\drawable-mdpi 364 | 1 365 | 366 | 367 | res\drawable-mdpi 368 | 1 369 | 370 | 371 | 372 | 373 | res\drawable-hdpi 374 | 1 375 | 376 | 377 | res\drawable-hdpi 378 | 1 379 | 380 | 381 | 382 | 383 | res\drawable-xhdpi 384 | 1 385 | 386 | 387 | res\drawable-xhdpi 388 | 1 389 | 390 | 391 | 392 | 393 | res\drawable-xxhdpi 394 | 1 395 | 396 | 397 | res\drawable-xxhdpi 398 | 1 399 | 400 | 401 | 402 | 403 | res\drawable-xxxhdpi 404 | 1 405 | 406 | 407 | res\drawable-xxxhdpi 408 | 1 409 | 410 | 411 | 412 | 413 | res\drawable-small 414 | 1 415 | 416 | 417 | res\drawable-small 418 | 1 419 | 420 | 421 | 422 | 423 | res\drawable-normal 424 | 1 425 | 426 | 427 | res\drawable-normal 428 | 1 429 | 430 | 431 | 432 | 433 | res\drawable-large 434 | 1 435 | 436 | 437 | res\drawable-large 438 | 1 439 | 440 | 441 | 442 | 443 | res\drawable-xlarge 444 | 1 445 | 446 | 447 | res\drawable-xlarge 448 | 1 449 | 450 | 451 | 452 | 453 | res\values 454 | 1 455 | 456 | 457 | res\values 458 | 1 459 | 460 | 461 | 462 | 463 | 1 464 | 465 | 466 | Contents\MacOS 467 | 1 468 | 469 | 470 | 0 471 | 472 | 473 | 474 | 475 | Contents\MacOS 476 | 1 477 | .framework 478 | 479 | 480 | Contents\MacOS 481 | 1 482 | .framework 483 | 484 | 485 | Contents\MacOS 486 | 1 487 | .framework 488 | 489 | 490 | 0 491 | 492 | 493 | 494 | 495 | 1 496 | .dylib 497 | 498 | 499 | 1 500 | .dylib 501 | 502 | 503 | 1 504 | .dylib 505 | 506 | 507 | Contents\MacOS 508 | 1 509 | .dylib 510 | 511 | 512 | Contents\MacOS 513 | 1 514 | .dylib 515 | 516 | 517 | Contents\MacOS 518 | 1 519 | .dylib 520 | 521 | 522 | 0 523 | .dll;.bpl 524 | 525 | 526 | 527 | 528 | 1 529 | .dylib 530 | 531 | 532 | 1 533 | .dylib 534 | 535 | 536 | 1 537 | .dylib 538 | 539 | 540 | Contents\MacOS 541 | 1 542 | .dylib 543 | 544 | 545 | Contents\MacOS 546 | 1 547 | .dylib 548 | 549 | 550 | Contents\MacOS 551 | 1 552 | .dylib 553 | 554 | 555 | 0 556 | .bpl 557 | 558 | 559 | 560 | 561 | 0 562 | 563 | 564 | 0 565 | 566 | 567 | 0 568 | 569 | 570 | 0 571 | 572 | 573 | 0 574 | 575 | 576 | Contents\Resources\StartUp\ 577 | 0 578 | 579 | 580 | Contents\Resources\StartUp\ 581 | 0 582 | 583 | 584 | Contents\Resources\StartUp\ 585 | 0 586 | 587 | 588 | 0 589 | 590 | 591 | 592 | 593 | 1 594 | 595 | 596 | 1 597 | 598 | 599 | 600 | 601 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 602 | 1 603 | 604 | 605 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 606 | 1 607 | 608 | 609 | 610 | 611 | ..\ 612 | 1 613 | 614 | 615 | ..\ 616 | 1 617 | 618 | 619 | ..\ 620 | 1 621 | 622 | 623 | 624 | 625 | Contents 626 | 1 627 | 628 | 629 | Contents 630 | 1 631 | 632 | 633 | Contents 634 | 1 635 | 636 | 637 | 638 | 639 | Contents\Resources 640 | 1 641 | 642 | 643 | Contents\Resources 644 | 1 645 | 646 | 647 | Contents\Resources 648 | 1 649 | 650 | 651 | 652 | 653 | library\lib\armeabi-v7a 654 | 1 655 | 656 | 657 | library\lib\arm64-v8a 658 | 1 659 | 660 | 661 | 1 662 | 663 | 664 | 1 665 | 666 | 667 | 1 668 | 669 | 670 | 1 671 | 672 | 673 | Contents\MacOS 674 | 1 675 | 676 | 677 | Contents\MacOS 678 | 1 679 | 680 | 681 | Contents\MacOS 682 | 1 683 | 684 | 685 | 0 686 | 687 | 688 | 689 | 690 | library\lib\armeabi-v7a 691 | 1 692 | 693 | 694 | 695 | 696 | 1 697 | 698 | 699 | 1 700 | 701 | 702 | 703 | 704 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 705 | 1 706 | 707 | 708 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 709 | 1 710 | 711 | 712 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 713 | 1 714 | 715 | 716 | 717 | 718 | ..\ 719 | 1 720 | 721 | 722 | ..\ 723 | 1 724 | 725 | 726 | ..\ 727 | 1 728 | 729 | 730 | 731 | 732 | 1 733 | 734 | 735 | 1 736 | 737 | 738 | 1 739 | 740 | 741 | 742 | 743 | ..\$(PROJECTNAME).launchscreen 744 | 64 745 | 746 | 747 | ..\$(PROJECTNAME).launchscreen 748 | 64 749 | 750 | 751 | 752 | 753 | 1 754 | 755 | 756 | 1 757 | 758 | 759 | 1 760 | 761 | 762 | 763 | 764 | Assets 765 | 1 766 | 767 | 768 | Assets 769 | 1 770 | 771 | 772 | 773 | 774 | Assets 775 | 1 776 | 777 | 778 | Assets 779 | 1 780 | 781 | 782 | 783 | 784 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 785 | 1 786 | 787 | 788 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 789 | 1 790 | 791 | 792 | 793 | 794 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 795 | 1 796 | 797 | 798 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 799 | 1 800 | 801 | 802 | 803 | 804 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 805 | 1 806 | 807 | 808 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 809 | 1 810 | 811 | 812 | 813 | 814 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 815 | 1 816 | 817 | 818 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 819 | 1 820 | 821 | 822 | 823 | 824 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 825 | 1 826 | 827 | 828 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 829 | 1 830 | 831 | 832 | 833 | 834 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 835 | 1 836 | 837 | 838 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 839 | 1 840 | 841 | 842 | 843 | 844 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 845 | 1 846 | 847 | 848 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 849 | 1 850 | 851 | 852 | 853 | 854 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 855 | 1 856 | 857 | 858 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 859 | 1 860 | 861 | 862 | 863 | 864 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 865 | 1 866 | 867 | 868 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 869 | 1 870 | 871 | 872 | 873 | 874 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 875 | 1 876 | 877 | 878 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 879 | 1 880 | 881 | 882 | 883 | 884 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 885 | 1 886 | 887 | 888 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 889 | 1 890 | 891 | 892 | 893 | 894 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 895 | 1 896 | 897 | 898 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 899 | 1 900 | 901 | 902 | 903 | 904 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 905 | 1 906 | 907 | 908 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 909 | 1 910 | 911 | 912 | 913 | 914 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 915 | 1 916 | 917 | 918 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 919 | 1 920 | 921 | 922 | 923 | 924 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 925 | 1 926 | 927 | 928 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 929 | 1 930 | 931 | 932 | 933 | 934 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 935 | 1 936 | 937 | 938 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 939 | 1 940 | 941 | 942 | 943 | 944 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 945 | 1 946 | 947 | 948 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 949 | 1 950 | 951 | 952 | 953 | 954 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 955 | 1 956 | 957 | 958 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 959 | 1 960 | 961 | 962 | 963 | 964 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 965 | 1 966 | 967 | 968 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 969 | 1 970 | 971 | 972 | 973 | 974 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 975 | 1 976 | 977 | 978 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 979 | 1 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | True 997 | False 998 | 999 | 1000 | 12 1001 | 1002 | 1003 | 1004 | 1005 |
1006 | -------------------------------------------------------------------------------- /Source/Project1.dres: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r57zone/EchoBackuper/a8baa775ae82c4fce0067f3992ee4b841464e390/Source/Project1.dres -------------------------------------------------------------------------------- /Source/Project1.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r57zone/EchoBackuper/a8baa775ae82c4fce0067f3992ee4b841464e390/Source/Project1.res -------------------------------------------------------------------------------- /Source/Project1.stat: -------------------------------------------------------------------------------- 1 | [Stats] 2 | EditorSecs=5137 3 | DesignerSecs=795 4 | InspectorSecs=244 5 | CompileSecs=51499 6 | OtherSecs=225 7 | StartTime=18.09.2019 1:21:09 8 | RealKeys=0 9 | EffectiveKeys=0 10 | DebugSecs=320 11 | -------------------------------------------------------------------------------- /Source/Project1Resource.rc: -------------------------------------------------------------------------------- 1 | MainIcon ICON "Icon.ico" 2 | -------------------------------------------------------------------------------- /Source/Project1_Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r57zone/EchoBackuper/a8baa775ae82c4fce0067f3992ee4b841464e390/Source/Project1_Icon.ico -------------------------------------------------------------------------------- /Source/Unit1.dfm: -------------------------------------------------------------------------------- 1 | object Main: TMain 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu, biMinimize] 5 | BorderStyle = bsSingle 6 | Caption = 'EchoBackuper' 7 | ClientHeight = 366 8 | ClientWidth = 576 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -11 13 | Font.Name = 'Tahoma' 14 | Font.Style = [] 15 | Menu = MainMenu 16 | Position = poScreenCenter 17 | OnClose = FormClose 18 | OnCloseQuery = FormCloseQuery 19 | OnCreate = FormCreate 20 | TextHeight = 13 21 | object CurOperationLbl: TLabel 22 | Left = 8 23 | Top = 303 24 | Width = 100 25 | Height = 13 26 | Caption = #1058#1077#1082#1091#1097#1072#1103' '#1086#1087#1077#1088#1072#1094#1080#1103':' 27 | end 28 | object AllOperationsLbl: TLabel 29 | Left = 8 30 | Top = 263 31 | Width = 72 32 | Height = 13 33 | Caption = #1042#1089#1077' '#1086#1087#1077#1088#1072#1094#1080#1080':' 34 | end 35 | object StatusBar: TStatusBar 36 | Left = 0 37 | Top = 347 38 | Width = 576 39 | Height = 19 40 | Panels = <> 41 | ParentShowHint = False 42 | ShowHint = True 43 | SimplePanel = True 44 | ExplicitTop = 346 45 | ExplicitWidth = 572 46 | end 47 | object RunBtn: TButton 48 | Left = 88 49 | Top = 233 50 | Width = 75 51 | Height = 25 52 | Caption = #1047#1072#1087#1091#1089#1090#1080#1090#1100 53 | TabOrder = 2 54 | OnClick = RunBtnClick 55 | end 56 | object ListView: TListView 57 | Left = 8 58 | Top = 8 59 | Width = 560 60 | Height = 217 61 | Checkboxes = True 62 | Columns = < 63 | item 64 | Caption = #1040#1082#1090#1080#1074#1085#1099#1081 65 | Width = 65 66 | end 67 | item 68 | Caption = #1048#1084#1103 69 | Width = 152 70 | end 71 | item 72 | Caption = #1051#1077#1074#1072#1103' '#1087#1072#1087#1082#1072 73 | Width = 161 74 | end 75 | item 76 | Caption = #1055#1088#1072#1074#1072#1103' '#1087#1072#1087#1082#1072 77 | Width = 161 78 | end> 79 | ReadOnly = True 80 | RowSelect = True 81 | TabOrder = 0 82 | ViewStyle = vsReport 83 | OnDblClick = ListViewDblClick 84 | OnKeyDown = ListViewKeyDown 85 | OnMouseDown = ListViewMouseDown 86 | end 87 | object ProgressBar: TProgressBar 88 | Left = 8 89 | Top = 280 90 | Width = 560 91 | Height = 17 92 | TabOrder = 5 93 | end 94 | object StopBtn: TButton 95 | Left = 169 96 | Top = 233 97 | Width = 75 98 | Height = 25 99 | Caption = #1054#1089#1090#1072#1085#1086#1074#1080#1090#1100 100 | Enabled = False 101 | TabOrder = 3 102 | OnClick = StopBtnClick 103 | end 104 | object OpenBtn2: TButton 105 | Left = 7 106 | Top = 233 107 | Width = 75 108 | Height = 25 109 | Caption = #1054#1090#1082#1088#1099#1090#1100 110 | TabOrder = 1 111 | OnClick = OpenBtn2Click 112 | end 113 | object ProgressBar2: TProgressBar 114 | Left = 8 115 | Top = 320 116 | Width = 560 117 | Height = 17 118 | TabOrder = 6 119 | end 120 | object OpenDialog: TOpenDialog 121 | Filter = 'Backup paths|*.ebp' 122 | Left = 32 123 | Top = 40 124 | end 125 | object SaveDialog: TSaveDialog 126 | DefaultExt = 'Backup paths|*.ebp' 127 | Filter = 'Backup paths|*.ebp' 128 | Left = 104 129 | Top = 40 130 | end 131 | object ListViewPM: TPopupMenu 132 | Left = 176 133 | Top = 40 134 | object RemSelectionBtn: TMenuItem 135 | Caption = #1057#1085#1103#1090#1100' '#1074#1099#1076#1077#1083#1077#1085#1080#1077 136 | OnClick = RemSelectionBtnClick 137 | end 138 | object SelectAllBtn: TMenuItem 139 | Caption = #1042#1099#1073#1088#1072#1090#1100' '#1074#1089#1077 140 | OnClick = SelectAllBtnClick 141 | end 142 | object LineNoneBtn31: TMenuItem 143 | Caption = '-' 144 | end 145 | object OpenFolderBtn: TMenuItem 146 | Caption = #1054#1090#1082#1088#1099#1090#1100 147 | object LeftFolderBtn: TMenuItem 148 | Caption = #1051#1077#1074#1072#1103' '#1087#1072#1087#1082#1072 149 | OnClick = LeftFolderBtnClick 150 | end 151 | object RightFolderBtn: TMenuItem 152 | Caption = #1055#1088#1072#1074#1072#1103' '#1082#1085#1086#1087#1082#1072 153 | OnClick = RightFolderBtnClick 154 | end 155 | end 156 | object LineNoneBtn32: TMenuItem 157 | Caption = '-' 158 | end 159 | object AddBtn2: TMenuItem 160 | Caption = #1044#1086#1073#1072#1074#1080#1090#1100 161 | OnClick = AddBtn2Click 162 | end 163 | object EditBtn2: TMenuItem 164 | Caption = #1048#1079#1084#1077#1085#1080#1090#1100 165 | OnClick = EditBtn2Click 166 | end 167 | object LineNoneBtn33: TMenuItem 168 | Caption = '-' 169 | end 170 | object MoveBtn: TMenuItem 171 | Caption = #1055#1077#1088#1077#1084#1077#1089#1090#1080#1090#1100 172 | object UpBtn: TMenuItem 173 | Caption = #1042#1099#1096#1077 174 | OnClick = UpBtnClick 175 | end 176 | object DownBtn: TMenuItem 177 | Caption = #1053#1080#1078#1077 178 | OnClick = DownBtnClick 179 | end 180 | end 181 | object LineNoneBtn34: TMenuItem 182 | Caption = '-' 183 | end 184 | object RemBtn2: TMenuItem 185 | Caption = #1059#1076#1072#1083#1080#1090#1100 186 | OnClick = RemBtn2Click 187 | end 188 | end 189 | object MainMenu: TMainMenu 190 | Left = 248 191 | Top = 40 192 | object FileBtn: TMenuItem 193 | Caption = #1060#1072#1081#1083 194 | object OpenBtn: TMenuItem 195 | Caption = #1054#1090#1082#1088#1099#1090#1100 196 | ShortCut = 16463 197 | OnClick = OpenBtnClick 198 | end 199 | object CreateBtn: TMenuItem 200 | Caption = #1057#1086#1079#1076#1072#1090#1100 201 | ShortCut = 16462 202 | OnClick = CreateBtnClick 203 | end 204 | object LineNoneBtn1: TMenuItem 205 | Caption = '-' 206 | end 207 | object SettingsBtn: TMenuItem 208 | Caption = #1053#1072#1089#1090#1088#1086#1081#1082#1080 209 | OnClick = SettingsBtnClick 210 | end 211 | object LineNoneBtn2: TMenuItem 212 | Caption = '-' 213 | end 214 | object ExitBtn: TMenuItem 215 | Caption = #1042#1099#1093#1086#1076 216 | ShortCut = 32883 217 | OnClick = ExitBtnClick 218 | end 219 | end 220 | object FoldersBtn: TMenuItem 221 | Caption = #1055#1072#1087#1082#1080 222 | object AddBtn: TMenuItem 223 | Caption = #1044#1086#1073#1072#1074#1080#1090#1100 224 | ShortCut = 24641 225 | OnClick = AddBtnClick 226 | end 227 | object EditBtn: TMenuItem 228 | Caption = #1048#1079#1084#1077#1085#1080#1090#1100 229 | ShortCut = 24653 230 | OnClick = EditBtnClick 231 | end 232 | object LineNoneBtn3: TMenuItem 233 | Caption = '-' 234 | end 235 | object ExcludeBtn: TMenuItem 236 | Caption = #1048#1089#1082#1083#1102#1095#1080#1090#1100 237 | ShortCut = 24645 238 | OnClick = ExcludeBtnClick 239 | end 240 | object LineNone4: TMenuItem 241 | Caption = '-' 242 | end 243 | object RemBtn: TMenuItem 244 | Caption = #1059#1076#1072#1083#1080#1090#1100 245 | ShortCut = 24658 246 | OnClick = RemBtnClick 247 | end 248 | end 249 | object HelpBtn: TMenuItem 250 | Caption = #1057#1087#1088#1072#1074#1082#1072 251 | object AboutBtn: TMenuItem 252 | Caption = #1054' '#1087#1088#1086#1075#1088#1072#1084#1084#1077'...' 253 | ShortCut = 112 254 | OnClick = AboutBtnClick 255 | end 256 | end 257 | end 258 | end 259 | -------------------------------------------------------------------------------- /Source/Unit1.pas: -------------------------------------------------------------------------------- 1 | unit Unit1; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, ShlObj, Registry, 8 | IniFiles, Vcl.Menus, ShellAPI, IdHashCRC, System.Generics.Collections, LangFile; 9 | 10 | type 11 | TMain = class(TForm) 12 | StatusBar: TStatusBar; 13 | RunBtn: TButton; 14 | ListView: TListView; 15 | ProgressBar: TProgressBar; 16 | StopBtn: TButton; 17 | OpenDialog: TOpenDialog; 18 | SaveDialog: TSaveDialog; 19 | ListViewPM: TPopupMenu; 20 | RemSelectionBtn: TMenuItem; 21 | SelectAllBtn: TMenuItem; 22 | LineNoneBtn31: TMenuItem; 23 | OpenFolderBtn: TMenuItem; 24 | LeftFolderBtn: TMenuItem; 25 | RightFolderBtn: TMenuItem; 26 | LineNoneBtn32: TMenuItem; 27 | MoveBtn: TMenuItem; 28 | UpBtn: TMenuItem; 29 | DownBtn: TMenuItem; 30 | MainMenu: TMainMenu; 31 | FileBtn: TMenuItem; 32 | OpenBtn: TMenuItem; 33 | CreateBtn: TMenuItem; 34 | LineNoneBtn1: TMenuItem; 35 | ExitBtn: TMenuItem; 36 | OpenBtn2: TButton; 37 | FoldersBtn: TMenuItem; 38 | AddBtn: TMenuItem; 39 | AddBtn2: TMenuItem; 40 | LineNoneBtn33: TMenuItem; 41 | LineNoneBtn3: TMenuItem; 42 | RemBtn: TMenuItem; 43 | LineNone4: TMenuItem; 44 | RemBtn2: TMenuItem; 45 | ExcludeBtn: TMenuItem; 46 | HelpBtn: TMenuItem; 47 | AboutBtn: TMenuItem; 48 | ProgressBar2: TProgressBar; 49 | CurOperationLbl: TLabel; 50 | AllOperationsLbl: TLabel; 51 | LineNoneBtn2: TMenuItem; 52 | SettingsBtn: TMenuItem; 53 | EditBtn: TMenuItem; 54 | EditBtn2: TMenuItem; 55 | LineNoneBtn34: TMenuItem; 56 | procedure FormCreate(Sender: TObject); 57 | procedure RunBtnClick(Sender: TObject); 58 | procedure AddBtn2Click(Sender: TObject); 59 | procedure RemBtn2Click(Sender: TObject); 60 | procedure ListViewDblClick(Sender: TObject); 61 | procedure StopBtnClick(Sender: TObject); 62 | procedure AboutBtnClick(Sender: TObject); 63 | procedure ListViewKeyDown(Sender: TObject; var Key: Word; 64 | Shift: TShiftState); 65 | procedure OpenBtnClick(Sender: TObject); 66 | procedure CreateBtnClick(Sender: TObject); 67 | procedure CheckRemoteFilesToMove; 68 | procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton; 69 | Shift: TShiftState; X, Y: Integer); 70 | procedure RemSelectionBtnClick(Sender: TObject); 71 | procedure SelectAllBtnClick(Sender: TObject); 72 | procedure LeftFolderBtnClick(Sender: TObject); 73 | procedure RightFolderBtnClick(Sender: TObject); 74 | procedure UpBtnClick(Sender: TObject); 75 | procedure DownBtnClick(Sender: TObject); 76 | procedure OpenBtn2Click(Sender: TObject); 77 | procedure AddBtnClick(Sender: TObject); 78 | procedure RemBtnClick(Sender: TObject); 79 | procedure ExcludeBtnClick(Sender: TObject); 80 | procedure SettingsBtnClick(Sender: TObject); 81 | procedure ExitBtnClick(Sender: TObject); 82 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 83 | procedure FormClose(Sender: TObject; var Action: TCloseAction); 84 | procedure EditBtnClick(Sender: TObject); 85 | procedure EditBtn2Click(Sender: TObject); 86 | private 87 | procedure LoadBackupPaths(FileName: string); 88 | { Private declarations } 89 | public 90 | procedure SaveBackupPaths; 91 | function BrowseFolderDialog(Title: PChar; Flags: Cardinal): string; 92 | { Public declarations } 93 | end; 94 | 95 | type 96 | TFSOperation = (ID_OPERATION_NONE, ID_OPERATION_COPY, ID_OPERATION_RENAME, ID_OPERATION_MOVE, ID_OPERATION_DELETE, ID_OPERATION_MKDIR, ID_OPERATION_RMDIR); 97 | const 98 | FSOperationStr: array[0..6] of string = ('NONE', 'COPY', 'RENAME', 'MOVE', 'DEL', 'MKDIR', 'RMDIR'); 99 | 100 | type 101 | TFSAction = packed record 102 | ActionType: TFSOperation; 103 | FirstPath, SecondPath: string; 104 | FirstFileSize: int64; 105 | FirstFileTime: integer; // Не менять, Time именно в Integer 106 | //SecondFileSize, SecondFileTime: int64; 107 | end; 108 | 109 | var 110 | Main: TMain; 111 | 112 | FSActions: TList; 113 | //Actions, 114 | ExcludePaths, ExcludeRenameFiles: TStringList; 115 | CurrentBackupFilePath: string; //Текущий файл путей для резервной копии 116 | 117 | FilesCounter, ActionGoodCounter, GoodCopyFilesCounter, GoodMoveFilesCounter, GoodRenameFilesCounter, GoodDeleteFilesCounter, 118 | GoodMakeFoldersCounter, GoodRemoveFoldersCounter, BadCopyFilesCounter, BadMoveFilesCounter, BadRenameFilesCounter, 119 | BadDeleteFilesCounter, BadMakeFoldersCounter, BadRemoveFoldersCounter: integer; 120 | 121 | StopRequest: boolean; AllowAppClose: boolean = true; RequestCloseApp: boolean = false; 122 | SilentMode: boolean; 123 | NotificationApp: string; 124 | 125 | CheckLogShow, CRCCopyCheck, WriteCreationDate, WriteAttributes: boolean; 126 | 127 | IDS_LOOKING_CHANGES, IDS_FILE_RENAMED, IDS_FOUND_NEW_FILE, IDS_FILE_UPDATED, IDS_FOUND_OLD_FILE, 128 | IDS_COPY_FILE, IDS_MOVE_FILE, IDS_RENAME_FILE, IDS_REMOVE_FILE, IDS_CREATE_FOLDER, IDS_REMOVE_FOLDER, IDS_CHECK_MOVE_FILES: string; 129 | IDS_COMPLETED, IDS_COMPLETED_ERROR, IDS_BACKUP_COMPLETED, IDS_BACKUP_FAILED, IDS_CHECK_FILES, IDS_TOTAL_OPERATIONS, 130 | IDS_SUCCESS_COPY_FILES, IDS_SUCCESS_MOVE_FILES, IDS_SUCCESS_RENAME_FILES, IDS_SUCCESS_REMOVE_FILES, 131 | IDS_SUCCESS_CREATE_FOLDERS, IDS_SUCCESS_REMOVE_FOLDERS, IDS_FAIL_COPY_FILES, IDS_FAIL_MOVE_FILES, IDS_FAIL_RENAME_FILES, 132 | IDS_FAIL_REMOVE_FILES, IDS_FAIL_CREATE_FOLDERS, IDS_FAIL_REMOVE_FOLDERS: string; 133 | IDS_PERFORM_OPERATIONS, IDS_ENTER_NAME_PAIR_FOLDERS, IDS_CHOOSE_LEFT_FOLDER, 134 | IDS_CHOOSE_RIGHT_FOLDER, IDS_CHOOSE_FOLDER_ERROR, IDS_SUCCESS_NOTIFICATION_MESSAGE, 135 | IDS_FAIL_NOTIFICATION_MESSAGE: string; 136 | IDS_ABOUT_TITLE, IDS_LAST_UPDATE: string; 137 | IDS_EXCLUDE_TITLE, IDS_SELECT_EXCLUDE_FOLDER, IDS_OK, IDS_CANCEL: string; 138 | 139 | IDS_VIEW_TASKS, IDS_CHECKSUM_VERIFICATION_COPY, IDS_COPY_CREATION_DATE, IDS_COPY_FILE_ATTRIBUTES: string; 140 | 141 | IDS_SAVE_AS, IDS_LOGS_FILE_DIALOG_FILTER, IDS_ADD_PAUSE_TO_FILE: string; 142 | 143 | const 144 | // Название файла путей для резеревной копии по умолчанию 145 | BACKUP_PATHS_FILE_NAME = 'BackupPaths.ebp'; 146 | // Зарезервированные фразы для файла 147 | PAIR_FOLDERS_FILE = 'PAIR FOLDERS:'; 148 | EXCLUDE_PATHS_FILE = 'EXCLUDE PATHS:'; 149 | 150 | implementation 151 | 152 | {$R *.dfm} 153 | 154 | uses Unit2, Unit3, Unit4; 155 | 156 | { TMain } 157 | 158 | function CutStr(Str: string; CharCount: integer): string; 159 | begin 160 | if Length(Str) > CharCount then 161 | Result:=Copy(Str, 1, CharCount - 3) + '...' 162 | else 163 | Result:=Str; 164 | end; 165 | 166 | procedure StatusText(FullStr, SmallStr: string); 167 | begin 168 | Main.StatusBar.Hint:=SmallStr; 169 | Main.StatusBar.SimpleText:=' ' + CutStr(FullStr, 80); 170 | end; 171 | 172 | function FileCreatedAge(const FileName: string): Integer; 173 | var 174 | SearchRec: TSearchRec; 175 | LocalTime: TFileTime; 176 | DOSFileTime: DWORD; 177 | begin 178 | Result:=-1; 179 | if FindFirst(FileName, faAnyFile, SearchRec) = 0 then begin 180 | FileTimeToLocalFileTime(SearchRec.FindData.ftCreationTime, LocalTime); 181 | if FileTimeToDosDateTime(LocalTime,LongRec(DOSFileTime).Hi,LongRec(DOSFileTime).Lo) then 182 | Result:=DOSFileTime; 183 | FindClose(SearchRec); 184 | end; 185 | end; 186 | 187 | function FileSetCreatedDate(FileName: string; Age: Integer): Integer; 188 | var 189 | SourceFile: THandle; 190 | LocalFileTime, FileTime: TFileTime; 191 | begin 192 | SourceFile:=FileOpen(FileName, fmOpenWrite or fmShareDenyNone); 193 | if SourceFile=THandle(-1) then 194 | Result:=GetLastError 195 | else if DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo, LocalFileTime) and LocalFileTimeToFileTime(LocalFileTime, FileTime) then begin 196 | Result:=0; 197 | SetFileTime(SourceFile, @FileTime, nil, nil); 198 | FileClose(SourceFile); 199 | end; 200 | end; 201 | 202 | function CalculateCRC32(const FileName: string): Cardinal; 203 | var 204 | Stream: TFileStream; 205 | Hash: TIdHashCRC32; 206 | begin 207 | Result:=0; 208 | Stream:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 209 | try 210 | Hash:=TIdHashCRC32.Create; 211 | try 212 | Result:=Hash.HashValue(Stream); 213 | finally 214 | Hash.Free; 215 | end; 216 | finally 217 | Stream.Free; 218 | end; 219 | end; 220 | 221 | function CPFile(const SourceFileName, TargetFileName: string): boolean; // Самостоятельное копирование файла 222 | const 223 | BufferSize = 4096; 224 | var 225 | SourceFile, TargetFile: THandle; 226 | NumRead, NumWritten: LongWord; // DWORD тоже самое 227 | SourceFileSize, CopySize: int64; 228 | Buffer: array[0..BufferSize-1] of Byte; 229 | SameSizes: boolean; 230 | begin 231 | Result:=false; 232 | try 233 | SourceFile:=CreateFile(PChar(SourceFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 234 | if SourceFile = INVALID_HANDLE_VALUE then Exit; 235 | 236 | if not GetFileSizeEx(SourceFile, SourceFileSize) then Exit; 237 | 238 | if FileExists(TargetFileName) then if DeleteFile(PChar(TargetFileName)) = false then Exit; // Удаляем файл, если существует 239 | 240 | try 241 | TargetFile:=CreateFile(PChar(TargetFileName), GENERIC_WRITE, FILE_SHARE_WRITE or FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 242 | if TargetFile = INVALID_HANDLE_VALUE then begin 243 | CloseHandle(SourceFile); 244 | Exit; 245 | end; 246 | 247 | try 248 | CopySize:=0; 249 | Main.ProgressBar2.Position:=0; 250 | repeat 251 | if (not ReadFile(SourceFile, Buffer, BufferSize, NumRead, nil)) or (NumRead = 0) then break; // NumRead = 0 для пустых файлов 252 | if not WriteFile(TargetFile, Buffer, NumRead, NumWritten, nil) then break; 253 | CopySize:=CopySize + NumWritten; // Inc(CopySize, NumWritten); 254 | StatusText(IDS_COPY_FILE + ' ' + IntToStr(Trunc(CopySize / SourceFileSize * 100)) + '% - ' + SourceFileName, SourceFileName); 255 | Main.ProgressBar2.Position:=Trunc(CopySize / SourceFileSize * 100); 256 | if StopRequest then break; 257 | Application.ProcessMessages; 258 | until (NumRead = 0) or (NumWritten <> NumRead); 259 | finally 260 | FileClose(TargetFile); 261 | StatusText(IDS_COPY_FILE + ' 100% - ' + SourceFileName, SourceFileName); 262 | Main.ProgressBar2.Max:=101; // Прогресс бар отображается с задержкой, поэтому такой обходной путь 263 | Main.ProgressBar2.Position:=101; 264 | Main.ProgressBar2.Max:=100; 265 | SameSizes := (CopySize = SourceFileSize); // Оверхед - if not GetFileSizeEx(TargetFile, TargetFileSize) then Exit; SameSizes:=(SourceFileSize = TargetFileSize); 266 | end; 267 | finally 268 | FileClose(SourceFile); 269 | end; 270 | finally 271 | Application.ProcessMessages; 272 | 273 | if (StopRequest = false) and (SameSizes) and (FileSetDate( TargetFileName, FileAge(SourceFileName) ) = 0) and 274 | ( (WriteCreationDate = false) or (FileSetCreatedDate( TargetFileName, FileCreatedAge(SourceFileName) ) = 0) ) and 275 | ( (CRCCopyCheck = false) or (CalculateCRC32(SourceFileName) = CalculateCRC32(TargetFileName)) ) and 276 | ( (WriteAttributes = false) or (FileSetAttr(TargetFileName, FileGetAttr(SourceFileName)) = 0) ) then Result:=true; // Атрибуты присваиваем в последнюю очередь, потому что еще нужно обновить даты создания и изменения 277 | 278 | end; 279 | 280 | Main.ProgressBar2.Position:=0; 281 | 282 | if (StopRequest) or (Result = false) then DeleteFile(PChar(TargetFileName)); 283 | end; 284 | 285 | procedure AddFSAction(const ActionType: TFSOperation; FirstPath, SecondPath: string; FirstFileSize: int64; FirstFileTime: integer); 286 | var 287 | NewAction: TFSAction; 288 | begin 289 | NewAction.ActionType:=ActionType; 290 | NewAction.FirstPath:=FirstPath; 291 | NewAction.SecondPath:=SecondPath; 292 | NewAction.FirstFileSize:=FirstFileSize; 293 | NewAction.FirstFileTime:=FirstFileTime; 294 | FSActions.Add(NewAction); 295 | end; 296 | 297 | procedure EdiTFSAction(Index: Integer; const ActionType: TFSOperation; FirstPath, SecondPath: string); 298 | var 299 | EditedAction: TFSAction; 300 | begin 301 | if (Index > -1) and (Index < FSActions.Count) then begin 302 | EditedAction.ActionType:=ActionType; 303 | EditedAction.FirstPath:=FirstPath; 304 | EditedAction.SecondPath:=SecondPath; 305 | EditedAction.FirstFileSize:=0; // Пока не нужно 306 | EditedAction.FirstFileTime:=0; // Пока не нужно 307 | FSActions[Index] := EditedAction; 308 | end; 309 | end; 310 | 311 | {procedure RemoveFSAction(Index: Integer); 312 | begin 313 | if (Index > -1) and (Index < FSActions.Count) then 314 | FSActions.Delete(Index); 315 | end;} 316 | 317 | procedure CheckFilesDiff(LocalFolder, RemoteFolder: string); 318 | var 319 | LocalFile, RemoteFile: TSearchRec; 320 | i: integer; 321 | FoundCurrentFile: boolean; 322 | begin 323 | if StopRequest then Exit; 324 | 325 | // Игнорируемые папки 326 | for i:=0 to ExcludePaths.Count - 1 do 327 | if ExcludePaths.Strings[i] = LocalFolder then Exit; 328 | 329 | if LocalFolder[Length(LocalFolder)] <> '\' then 330 | LocalFolder:=LocalFolder + '\'; 331 | if RemoteFolder[Length(RemoteFolder)] <> '\' then 332 | RemoteFolder:=RemoteFolder + '\'; 333 | 334 | StatusText(IDS_LOOKING_CHANGES + ' ' + LocalFolder, LocalFolder); 335 | 336 | if FindFirst(LocalFolder + '*.*', faAnyFile, LocalFile) = 0 then 337 | repeat 338 | Application.ProcessMessages; 339 | 340 | if (LocalFile.Name = '.') or (LocalFile.Name = '..') then Continue; // Не обрабатываем возвраты папок 341 | 342 | // Проверка файлов 343 | if (LocalFile.Attr and faDirectory) <> faDirectory then begin 344 | 345 | Inc(FilesCounter); 346 | 347 | // Если файл отсуствует, то копируем, а если во вторичной папке есть этот файл, то переименовываем 348 | if not FileExists(RemoteFolder + LocalFile.Name) then begin 349 | 350 | // Проверяем все файлы во вторичной папке, на случай если файл переименовали 351 | FoundCurrentFile:=false; 352 | if FindFirst(RemoteFolder + '*.*', faAnyFile, RemoteFile) = 0 then 353 | repeat 354 | Application.ProcessMessages; 355 | 356 | // Если время файла, размер совпадает и такого файла нет в первичной папке, то переименовываем файл во вторичной папке 357 | // Файл переименован 358 | if (LocalFile.Time = RemoteFile.Time) and (LocalFile.Size = RemoteFile.Size) and (FileExists(LocalFolder + RemoteFile.Name) = false) then begin 359 | //Actions.Add('RENAME ' + RemoteFolder + RemoteFile.Name + #9 + RemoteFolder + LocalFile.Name); 360 | AddFSAction(ID_OPERATION_RENAME, RemoteFolder + RemoteFile.Name, RemoteFolder + LocalFile.Name, 0, 0); 361 | // Добавляем в список игнориемых файлов, чтобы он не удалился (до переименования) 362 | ExcludeRenameFiles.Add(RemoteFolder + RemoteFile.Name); 363 | StatusText(IDS_FILE_RENAMED + ' ' + LocalFolder + LocalFile.Name, LocalFolder + LocalFile.Name); 364 | FoundCurrentFile:=true; 365 | Break; 366 | end; 367 | 368 | until FindNext(RemoteFile) <> 0; 369 | FindClose(RemoteFile); 370 | 371 | // Если во вторичной папке схожих файлов не найдено, то просто копируем новый файл 372 | // Найден новый файл 373 | if FoundCurrentFile = false then begin 374 | //Actions.Add('COPY ' + LocalFolder + LocalFile.Name + #9 + RemoteFolder + LocalFile.Name); 375 | AddFSAction(ID_OPERATION_COPY, LocalFolder + LocalFile.Name, RemoteFolder + LocalFile.Name, LocalFile.Size, LocalFile.Time); 376 | StatusText(IDS_FOUND_NEW_FILE + ' ' + LocalFolder + LocalFile.Name, LocalFolder + LocalFile.Name); 377 | end; 378 | 379 | // Если файл есть 380 | end else if FindFirst(RemoteFolder + LocalFile.Name, faAnyFile, RemoteFile) = 0 then begin 381 | 382 | // Если время файла или размер не совпадает, то копируем 383 | // Файл обновлён 384 | if (LocalFile.Time <> RemoteFile.Time) or (LocalFile.Size <> RemoteFile.Size) then begin 385 | //Actions.Add('COPY ' + LocalFolder + LocalFile.Name + #9 + RemoteFolder + LocalFile.Name); 386 | AddFSAction(ID_OPERATION_COPY, LocalFolder + LocalFile.Name, RemoteFolder + LocalFile.Name, LocalFile.Size, LocalFile.Time); 387 | StatusText(IDS_FILE_UPDATED + ' ' + LocalFolder + LocalFile.Name, LocalFolder + LocalFile.Name); 388 | end; 389 | 390 | FindClose(RemoteFile); 391 | end; 392 | 393 | // Проверка папок 394 | end else begin 395 | // Создаём папку если её не существует и её нет в списке игнорируемых 396 | if (not DirectoryExists(RemoteFolder + LocalFile.Name)) and (Pos(LocalFolder + LocalFile.Name, ExcludePaths.Text) = 0) then 397 | //Actions.Add('MKDIR ' + RemoteFolder + LocalFile.Name); 398 | AddFSAction(ID_OPERATION_MKDIR, RemoteFolder + LocalFile.Name, '', 0, 0); 399 | 400 | // Сравниваем файлы 401 | CheckFilesDiff(LocalFolder + LocalFile.Name, RemoteFolder + LocalFile.Name); 402 | end; 403 | 404 | until FindNext(LocalFile) <> 0; 405 | FindClose(LocalFile); 406 | end; 407 | 408 | procedure CheckRemoteFilesToRemove(LocalFolder, RemoteFolder: string); 409 | var 410 | LocalFile, RemoteFile: TSearchRec; 411 | i: integer; 412 | begin 413 | if StopRequest then Exit; 414 | 415 | // Игнорируемые папки 416 | for i:=0 to ExcludePaths.Count - 1 do 417 | if ExcludePaths.Strings[i] = LocalFolder then Exit; 418 | 419 | if LocalFolder[Length(LocalFolder)] <> '\' then 420 | LocalFolder:=LocalFolder + '\'; 421 | if RemoteFolder[Length(RemoteFolder)] <> '\' then 422 | RemoteFolder:=RemoteFolder + '\'; 423 | 424 | if FindFirst(RemoteFolder + '*.*', faAnyFile, RemoteFile) = 0 then 425 | repeat 426 | Application.ProcessMessages; 427 | if (RemoteFile.Name <> '.') and (RemoteFile.Name <> '..') then 428 | if (RemoteFile.Attr and faDirectory) <> faDirectory then begin 429 | 430 | // Проверяем наличие файлов и исключаем файлы для переименования 431 | // Найден старый файл 432 | if (FileExists(LocalFolder + RemoteFile.Name) = false) and (Pos(RemoteFolder + RemoteFile.Name, ExcludeRenameFiles.Text) = 0) then begin 433 | //Actions.Add('DELETE ' + RemoteFolder + RemoteFile.Name); 434 | AddFSAction(ID_OPERATION_DELETE, RemoteFolder + RemoteFile.Name, '', RemoteFile.Size, RemoteFile.Time); 435 | StatusText(IDS_FOUND_OLD_FILE + ' ' + RemoteFolder + RemoteFile.Name, RemoteFolder + RemoteFile.Name); 436 | end; 437 | 438 | end else begin 439 | CheckRemoteFilesToRemove(LocalFolder + RemoteFile.Name, RemoteFolder + RemoteFile.Name); 440 | 441 | // После проверки файлов проверяем наличие папки 442 | if not DirectoryExists(LocalFolder + RemoteFile.Name) then 443 | //Actions.Add('RMDIR ' + RemoteFolder + RemoteFile.Name); 444 | AddFSAction(ID_OPERATION_RMDIR, RemoteFolder + RemoteFile.Name, '', 0, 0); 445 | end; 446 | until FindNext(RemoteFile) <> 0; 447 | 448 | FindClose(RemoteFile); 449 | end; 450 | 451 | // Сравнение двух файлов на соотвествие, по дате и размеру 452 | {function CompareFileIdentity(FirstFilePath, SecondFilePath: string): boolean; 453 | var 454 | FirstFile, SecondFile: TSearchRec; 455 | begin 456 | Result:=false; 457 | if FindFirst(FirstFilePath, faAnyFile, FirstFile) = 0 then begin 458 | 459 | if FindFirst(SecondFilePath, faAnyFile, SecondFile) = 0 then begin 460 | 461 | if (FirstFile.Time = SecondFile.Time) and (FirstFile.Size = SecondFile.Size) then 462 | Result:=true; 463 | 464 | FindClose(SecondFile); 465 | end; 466 | 467 | FindClose(FirstFile); 468 | end; 469 | end;} 470 | 471 | procedure TMain.CheckRemoteFilesToMove; // Если файл был перемещён в другую папку, то перемещаем файл, а не удаляем и копируем снова 472 | var 473 | i, j: integer; 474 | //ActionStr, DeleteFilePath, FirstCopyFilePath, SecondCopyFilePath: string; 475 | begin 476 | //if Actions.Count = 0 then Exit; 477 | if FSActions.Count = 0 then Exit; 478 | StatusText(IDS_CHECK_MOVE_FILES, IDS_CHECK_MOVE_FILES); 479 | 480 | ProgressBar.Max:=FSActions.Count; 481 | 482 | for i:=0 to FSActions.Count - 1 do begin 483 | //for i:=0 to Actions.Count - 1 do begin 484 | if StopRequest then Break; 485 | 486 | if FSActions[i].ActionType = ID_OPERATION_DELETE then begin 487 | //if Copy(Actions.Strings[i], 1, 7) = 'DELETE ' then begin 488 | //ActionStr:=Actions.Strings[i]; 489 | //Delete(ActionStr, 1, 7); 490 | //DeleteFilePath:=ActionStr; 491 | 492 | for j:=0 to FSActions.Count - 1 do begin 493 | //for j:=0 to Actions.Count - 1 do begin 494 | Application.ProcessMessages; 495 | if i = j then Continue; // Пропускаем DELETE 496 | 497 | // Ищем копируемые файлы 498 | if FSActions[j].ActionType = ID_OPERATION_COPY then begin 499 | //if Copy(Actions.Strings[j], 1, 5) = 'COPY ' then begin 500 | //ActionStr:=Actions.Strings[j]; 501 | //Delete(ActionStr, 1, 5); 502 | 503 | //FirstCopyFilePath:=Copy(ActionStr, 1, Pos(#9, ActionStr) - 1); 504 | //SecondCopyFilePath:=Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)); 505 | 506 | // Сравнение двух файлов на соотвествие, по дате и размеру 507 | //if CompareFileIdentity(DeleteFilePath, FirstCopyFilePath) then begin 508 | //if CompareFileIdentity(FSActions[i].FirstPath, FSActions[j].FirstPath) then begin // новое 509 | 510 | if (FSActions[i].FirstFileTime = FSActions[j].FirstFileTime) and (FSActions[i].FirstFileSize = FSActions[j].FirstFileSize) then begin 511 | 512 | EdiTFSAction(j, ID_OPERATION_MOVE, FSActions[i].FirstPath, FSActions[j].SecondPath); 513 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 514 | 515 | //Actions.Strings[j]:='MOVE ' + DeleteFilePath + #9 + SecondCopyFilePath; 516 | //Actions.Strings[i]:='FIXED'; 517 | Break; 518 | end; 519 | end; 520 | 521 | end; 522 | end; 523 | ProgressBar.Position:=i + 1; // Отображаем прогресс 524 | end; 525 | 526 | // Убираем исправленные действия 527 | //Actions.Text:=StringReplace(Actions.Text, 'FIXED' + #13#10, '', [rfReplaceAll]); 528 | 529 | // Пропуск ID_OPERATION_NONE в конце быстрее, чем удаление 530 | {for i:=FSActions.Count - 1 downto 0 do 531 | if FSActions[i].ActionType = ID_OPERATION_NONE then 532 | FSActions.Delete(i);} 533 | 534 | ProgressBar.Position:=0; 535 | end; 536 | 537 | procedure TMain.SelectAllBtnClick(Sender: TObject); 538 | var 539 | i: integer; 540 | Item: TListItem; 541 | begin 542 | for i:=0 to ListView.Items.Count - 1 do begin 543 | Item:=ListView.Items.Item[i]; 544 | Item.Checked:=true; 545 | end; 546 | end; 547 | 548 | procedure ActionsRun; 549 | var 550 | i: integer; //ActionStr: string; 551 | begin 552 | Main.ProgressBar.Max:=FSActions.Count; 553 | //for i:=0 to Actions.Count - 1 do begin 554 | for i:=0 to FSActions.Count - 1 do begin 555 | 556 | Main.ProgressBar.Position:=i + 1; 557 | 558 | if StopRequest then Break; 559 | 560 | //ActionStr:=Actions.Strings[i]; 561 | 562 | //if Copy(Actions.Strings[i], 1, 5) = 'COPY ' then begin 563 | case FSActions[i].ActionType of 564 | ID_OPERATION_COPY: begin 565 | //Delete(ActionStr, 1, 5); 566 | try 567 | //StatusText(ID_COPY_FILE + ' ' + Copy(ActionStr, 1, Pos(#9, ActionStr) - 1)); 568 | StatusText(IDS_COPY_FILE + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 569 | //if CopyFile( PChar( Copy(ActionStr, 1, Pos(#9, ActionStr) - 1) ), 570 | // PChar( Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)) ), false) then begin 571 | if CPFile( FSActions[i].FirstPath, FSActions[i].SecondPath ) then begin 572 | Inc(GoodCopyFilesCounter); 573 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 574 | //Actions.Strings[i]:=''; 575 | end else 576 | Inc(BadCopyFilesCounter); 577 | Application.ProcessMessages; 578 | except 579 | Inc(BadCopyFilesCounter); 580 | end; 581 | end; 582 | 583 | //if Copy(Actions.Strings[i], 1, 5) = 'MOVE ' then begin 584 | ID_OPERATION_MOVE: begin 585 | //Delete(ActionStr, 1, 5); 586 | try 587 | //StatusText(ID_MOVE_FILE + ' ' + Copy(ActionStr, 1, Pos(#9, ActionStr) - 1)); 588 | StatusText(IDS_MOVE_FILE + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 589 | //if FileExists( Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)) ) then 590 | if FileExists( FSActions[i].SecondPath ) then // Если старый, конечный файл существует, то удаляем его перед перемещением нового 591 | //DeleteFile( Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)) ); 592 | DeleteFile( FSActions[i].SecondPath ); 593 | //if MoveFile( PChar( Copy(ActionStr, 1, Pos(#9, ActionStr) - 1) ), 594 | if MoveFile( PChar( FSActions[i].FirstPath ), 595 | //PChar( Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)) ) ) then begin 596 | PChar( FSActions[i].SecondPath ) ) then begin 597 | Inc(GoodMoveFilesCounter); 598 | //Actions.Strings[i]:=''; 599 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 600 | end else 601 | Inc(BadMoveFilesCounter); 602 | except 603 | Inc(BadMoveFilesCounter); 604 | end; 605 | end; 606 | 607 | //if Copy(Actions.Strings[i], 1, 7) = 'RENAME ' then begin 608 | ID_OPERATION_RENAME: begin 609 | //Delete(ActionStr, 1, 7); 610 | try 611 | //StatusText(ID_RENAME_FILE + ' ' + Copy(ActionStr, 1, Pos(#9, ActionStr) - 1)); 612 | StatusText(IDS_RENAME_FILE + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 613 | // if RenameFile( PChar( Copy(ActionStr, 1, Pos(#9, ActionStr) - 1) ), 614 | // PChar( Copy(ActionStr, Pos(#9, ActionStr) + 1, Length(ActionStr)) ) ) then begin 615 | if RenameFile( PChar( FSActions[i].FirstPath ), 616 | PChar( FSActions[i].SecondPath ) ) then begin 617 | Inc(GoodRenameFilesCounter); 618 | //Actions.Strings[i]:=''; 619 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 620 | end else 621 | Inc(BadRenameFilesCounter); 622 | except 623 | Inc(BadRenameFilesCounter); 624 | end; 625 | end; 626 | 627 | //if Copy(Actions.Strings[i], 1, 7) = 'DELETE ' then begin 628 | ID_OPERATION_DELETE: begin 629 | //Delete(ActionStr, 1, 7); 630 | try 631 | //StatusText(ID_REMOVE_FILE + ' ' + ActionStr); 632 | StatusText(IDS_REMOVE_FILE + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 633 | //if DeleteFile(ActionStr) then begin 634 | if DeleteFile(FSActions[i].FirstPath) then begin 635 | Inc(GoodDeleteFilesCounter); 636 | //Actions.Strings[i]:=''; 637 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 638 | end else 639 | Inc(BadDeleteFilesCounter); 640 | except 641 | Inc(BadDeleteFilesCounter); 642 | end; 643 | end; 644 | 645 | //if Copy(Actions.Strings[i], 1, 6) = 'MKDIR ' then begin 646 | ID_OPERATION_MKDIR: begin 647 | //Delete(ActionStr, 1, 6); 648 | try 649 | //StatusText(ID_CREATE_FOLDER + ' ' + ActionStr); 650 | StatusText(IDS_CREATE_FOLDER + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 651 | //if CreateDir(ActionStr) then begin 652 | if CreateDir(FSActions[i].FirstPath) then begin 653 | Inc(GoodMakeFoldersCounter); 654 | //Actions.Strings[i]:=''; 655 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 656 | end else 657 | Inc(BadMakeFoldersCounter); 658 | except 659 | Inc(BadMakeFoldersCounter); 660 | end; 661 | end; 662 | 663 | //if Copy(Actions.Strings[i], 1, 6) = 'RMDIR ' then begin 664 | ID_OPERATION_RMDIR: begin 665 | //Delete(ActionStr, 1, 6); 666 | try 667 | //StatusText(ID_REMOVE_FOLDER + ' ' + ActionStr); 668 | StatusText(IDS_REMOVE_FOLDER + ' ' + FSActions[i].FirstPath, FSActions[i].FirstPath); 669 | //if RemoveDir(ActionStr) then begin 670 | if RemoveDir(FSActions[i].FirstPath) then begin 671 | Inc(GoodRemoveFoldersCounter); 672 | //Actions.Strings[i]:=''; 673 | EdiTFSAction(i, ID_OPERATION_NONE, '', ''); 674 | end else 675 | Inc(BadRemoveFoldersCounter); 676 | except 677 | Inc(BadRemoveFoldersCounter); 678 | end; 679 | end; 680 | end; 681 | 682 | if StopRequest then Main.ProgressBar.Position:=0; 683 | end; 684 | end; 685 | 686 | function GetNotificationAppPath: string; 687 | var 688 | Reg: TRegistry; 689 | begin 690 | Reg:=TRegistry.Create; 691 | Reg.RootKey:=HKEY_CURRENT_USER; 692 | if Reg.OpenKey('\Software\r57zone\Notification', false) then begin 693 | Result:=Reg.ReadString('Path'); 694 | Reg.CloseKey; 695 | end; 696 | Reg.Free; 697 | end; 698 | 699 | function GetLocaleInformation(Flag: integer): string; 700 | var 701 | pcLCA: array [0..20] of Char; 702 | begin 703 | if GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, Flag, pcLCA, 19) <= 0 then 704 | pcLCA[0]:=#0; 705 | Result:=pcLCA; 706 | end; 707 | 708 | procedure TMain.FormCreate(Sender: TObject); 709 | var 710 | Ini: TIniFile; i: integer; CustomBackupFile: string; 711 | LangFileName: string; LangFile: TLangFile; 712 | begin 713 | Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini'); 714 | CheckLogShow:=Ini.ReadBool('Main', 'LookTasks', true); 715 | OpenDialog.InitialDir:=Ini.ReadString('Main', 'BackupFilesFolder', ''); 716 | CRCCopyCheck:=Ini.ReadBool('Main', 'CRCCopyCheck', false); 717 | WriteCreationDate:=Ini.ReadBool('Main', 'WriteCreationDate', false); 718 | WriteAttributes:=Ini.ReadBool('Main', 'WriteAttributes', false); 719 | Ini.Free; 720 | 721 | //Width:=588; 722 | //Height:=424; 723 | 724 | // Перевод 725 | LangFileName:=GetLocaleInformation(LOCALE_SENGLANGUAGE) + '.txt'; 726 | if not FileExists(ExtractFilePath(ParamStr(0)) + 'Languages\' + LangFileName) then 727 | LangFileName:='English.txt'; 728 | //LangFileName:='English.txt'; 729 | //LangFileName:='Chinese.txt'; 730 | //LangFileName:='Spanish.txt'; 731 | //LangFileName:='Portuguese.txt'; 732 | //LangFileName:='French.txt'; 733 | //LangFileName:='German.txt'; 734 | //LangFileName:='Japanese.txt'; 735 | //LangFileName:='Italian.txt'; 736 | //LangFileName:='Korean.txt'; 737 | 738 | LangFile:=TLangFile.Create(ExtractFilePath(ParamStr(0)) + 'Languages\' + LangFileName); 739 | try 740 | ListView.Columns[0].Caption:=LangFile.GetString('ACTIVE', ''); 741 | ListView.Columns[1].Caption:=LangFile.GetString('NAME', ''); 742 | ListView.Columns[2].Caption:=LangFile.GetString('LEFT_FOLDER', ''); 743 | ListView.Columns[3].Caption:=LangFile.GetString('RIGHT_FOLDER', ''); 744 | RemSelectionBtn.Caption:=LangFile.GetString('REM_SELECTION', ''); 745 | SelectAllBtn.Caption:=LangFile.GetString('SELECT_ALL', ''); 746 | MoveBtn.Caption:=LangFile.GetString('MOVE', ''); 747 | UpBtn.Caption:=LangFile.GetString('UP', ''); 748 | DownBtn.Caption:=LangFile.GetString('DOWN', ''); 749 | FileBtn.Caption:=LangFile.GetString('FILE', ''); 750 | OpenFolderBtn.Caption:=LangFile.GetString('OPEN', ''); 751 | LeftFolderBtn.Caption:=LangFile.GetString('LEFT_FOLDER', ''); 752 | RightFolderBtn.Caption:=LangFile.GetString('RIGHT_FOLDER', ''); 753 | RunBtn.Caption:=LangFile.GetString('RUN', ''); 754 | CreateBtn.Caption:=LangFile.GetString('CREATE', ''); 755 | OpenBtn.Caption:=OpenFolderBtn.Caption; 756 | OpenBtn2.Caption:=OpenBtn.Caption; 757 | ExitBtn.Caption:=LangFile.GetString('EXIT', ''); 758 | FoldersBtn.Caption:=LangFile.GetString('FOLDERS', ''); 759 | AddBtn.Caption:=LangFile.GetString('ADD', ''); 760 | AddBtn2.Caption:=AddBtn.Caption; 761 | EditBtn.Caption:=LangFile.GetString('EDIT', ''); 762 | EditBtn2.Caption:=EditBtn.Caption; 763 | RemBtn.Caption:=LangFile.GetString('REMOVE', ''); 764 | RemBtn2.Caption:=RemBtn.Caption; 765 | ExcludeBtn.Caption:=LangFile.GetString('EXCLUDE', ''); 766 | StopBtn.Caption:=LangFile.GetString('STOP', ''); 767 | AllOperationsLbl.Caption:=LangFile.GetString('ALL_OPERATIONS', ''); 768 | CurOperationLbl.Caption:=LangFile.GetString('CURRENT_OPERATION', ''); 769 | HelpBtn.Caption:=LangFile.GetString('HELP', ''); 770 | OpenDialog.Filter:=LangFile.GetString('FILE_DIALOG_FILTER', ''); 771 | SaveDialog.Filter:=OpenDialog.Filter; 772 | SaveDialog.DefaultExt:=SaveDialog.Filter; 773 | 774 | IDS_VIEW_TASKS:=LangFile.GetString('VIEW_TASKS', ''); 775 | SettingsBtn.Caption:=LangFile.GetString('SETTINGS', ''); 776 | IDS_CHECKSUM_VERIFICATION_COPY:=LangFile.GetString('CHECKSUM_VERIFICATION_COPY', ''); 777 | IDS_COPY_CREATION_DATE:=LangFile.GetString('COPY_CREATION_DATE', ''); 778 | IDS_COPY_FILE_ATTRIBUTES:=LangFile.GetString('COPY_FILE_ATTRIBUTES', ''); 779 | 780 | IDS_LOOKING_CHANGES:=LangFile.GetString('LOOKING_CHANGES', ''); 781 | IDS_FILE_RENAMED:=LangFile.GetString('FILE_RENAMED', ''); 782 | IDS_FOUND_NEW_FILE:=LangFile.GetString('FOUND_NEW_FILE', ''); 783 | IDS_FILE_UPDATED:=LangFile.GetString('FILE_UPDATED', ''); 784 | IDS_FOUND_OLD_FILE:=LangFile.GetString('FOUND_OLD_FILE', ''); 785 | IDS_COPY_FILE:=LangFile.GetString('COPY_FILE', ''); 786 | IDS_MOVE_FILE:=LangFile.GetString('MOVE_FILE', ''); 787 | IDS_RENAME_FILE:=LangFile.GetString('RENAME_FILE', ''); 788 | IDS_REMOVE_FILE:=LangFile.GetString('REMOVE_FILE', ''); 789 | IDS_CREATE_FOLDER:=LangFile.GetString('CREATE_FOLDER', ''); 790 | IDS_REMOVE_FOLDER:=LangFile.GetString('REMOVE_FOLDER', ''); 791 | IDS_CHECK_MOVE_FILES:=LangFile.GetString('CHECK_MOVE_FILES', ''); 792 | IDS_COMPLETED:=LangFile.GetString('COMPLETED', ''); 793 | IDS_COMPLETED_ERROR:=LangFile.GetString('COMPLETED_ERROR', ''); 794 | IDS_BACKUP_COMPLETED:=LangFile.GetString('BACKUP_COMPLETED', ''); 795 | IDS_BACKUP_FAILED:=LangFile.GetString('BACKUP_FAILED', ''); 796 | IDS_CHECK_FILES:=LangFile.GetString('CHECK_FILES', ''); 797 | IDS_TOTAL_OPERATIONS:=LangFile.GetString('TOTAL_OPERATIONS', ''); 798 | IDS_SUCCESS_COPY_FILES:=LangFile.GetString('SUCCESS_COPY_FILES', ''); 799 | IDS_SUCCESS_MOVE_FILES:=LangFile.GetString('SUCCESS_MOVE_FILES', ''); 800 | IDS_SUCCESS_RENAME_FILES:=LangFile.GetString('SUCCESS_RENAME_FILES', ''); 801 | IDS_SUCCESS_REMOVE_FILES:=LangFile.GetString('SUCCESS_REMOVE_FILES', ''); 802 | IDS_SUCCESS_CREATE_FOLDERS:=LangFile.GetString('SUCCESS_CREATE_FOLDERS', ''); 803 | IDS_SUCCESS_REMOVE_FOLDERS:=LangFile.GetString('SUCCESS_REMOVE_FOLDERS', ''); 804 | IDS_FAIL_COPY_FILES:=LangFile.GetString('FAIL_COPY_FILES', ''); 805 | IDS_FAIL_MOVE_FILES:=LangFile.GetString('FAIL_MOVE_FILES', ''); 806 | IDS_FAIL_RENAME_FILES:=LangFile.GetString('FAIL_RENAME_FILES', ''); 807 | IDS_FAIL_REMOVE_FILES:=LangFile.GetString('FAIL_REMOVE_FILES', ''); 808 | IDS_FAIL_CREATE_FOLDERS:=LangFile.GetString('FAIL_CREATE_FOLDERS', ''); 809 | IDS_FAIL_REMOVE_FOLDERS:=LangFile.GetString('FAIL_REMOVE_FOLDERS', ''); 810 | 811 | IDS_PERFORM_OPERATIONS:=LangFile.GetString('PERFORM_OPERATIONS', ''); 812 | IDS_ENTER_NAME_PAIR_FOLDERS:=LangFile.GetString('ENTER_NAME_PAIR_FOLDERS', ''); 813 | IDS_CHOOSE_LEFT_FOLDER:=LangFile.GetString('CHOOSE_LEFT_FOLDER', ''); 814 | IDS_CHOOSE_RIGHT_FOLDER:=LangFile.GetString('CHOOSE_RIGHT_FOLDER', ''); 815 | IDS_CHOOSE_FOLDER_ERROR:=LangFile.GetString('CHOOSE_FOLDER_ERROR', ''); 816 | IDS_SUCCESS_NOTIFICATION_MESSAGE:=LangFile.GetString('SUCCESS_NOTIFICATION_MESSAGE', ''); 817 | IDS_FAIL_NOTIFICATION_MESSAGE:=LangFile.GetString('FAIL_NOTIFICATION_MESSAGE', ''); 818 | 819 | IDS_ABOUT_TITLE:=LangFile.GetString('ABOUT_TITLE', ''); 820 | IDS_LAST_UPDATE:=LangFile.GetString('LAST_UPDATE', ''); 821 | 822 | IDS_EXCLUDE_TITLE:=LangFile.GetString('EXCLUDE_TITLE', ''); 823 | IDS_SELECT_EXCLUDE_FOLDER:=LangFile.GetString('SELECT_EXCLUDE_FOLDER', ''); 824 | IDS_OK:=LangFile.GetString('OK', ''); 825 | IDS_CANCEL:=LangFile.GetString('CANCEL', ''); 826 | 827 | AboutBtn.Caption:=IDS_ABOUT_TITLE; 828 | 829 | IDS_SAVE_AS:=LangFile.GetString('SAVE_AS', ''); 830 | IDS_LOGS_FILE_DIALOG_FILTER:=LangFile.GetString('LOGS_FILE_DIALOG_FILTER', ''); 831 | IDS_ADD_PAUSE_TO_FILE:=LangFile.GetString('ADD_PAUSE_TO_FILE', ''); 832 | finally 833 | LangFile.Free; 834 | end; 835 | 836 | Application.Title:=Caption; 837 | 838 | for i:=1 to ParamCount do begin 839 | if ParamStr(i) = '-b' then 840 | CustomBackupFile:=ParamStr(i + 1); 841 | if ParamStr(i) = '-s' then 842 | SilentMode:=true; 843 | end; 844 | 845 | ExcludePaths:=TStringList.Create; // Создаём до загрузки путей для исключения 846 | 847 | if CustomBackupFile = '' then 848 | LoadBackupPaths(ExtractFilePath(ParamStr(0)) + BACKUP_PATHS_FILE_NAME) 849 | else 850 | LoadBackupPaths(ExtractFilePath(ParamStr(0)) + CustomBackupFile); 851 | 852 | //Actions:=TStringList.Create; 853 | FSActions:=TList.Create; 854 | ExcludeRenameFiles:=TStringList.Create; 855 | 856 | if SilentMode then begin 857 | NotificationApp:=GetNotificationAppPath; 858 | RunBtn.Click; 859 | Halt(0); 860 | end; 861 | end; 862 | 863 | procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction); 864 | begin 865 | //Actions.Free; 866 | FSActions.Free; 867 | ExcludePaths.Free; 868 | ExcludeRenameFiles.Free; 869 | end; 870 | 871 | procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 872 | begin 873 | if SilentMode then Exit; 874 | StopRequest:=true; 875 | RequestCloseApp:=true; 876 | CanClose:=AllowAppClose; 877 | end; 878 | 879 | function OutFSActions: string; 880 | var 881 | i: integer; 882 | LogLine: string; 883 | begin 884 | Result:=''; 885 | for i:=0 to FSActions.Count - 1 do 886 | if FSActions[i].ActionType <> ID_OPERATION_NONE then begin 887 | LogLine:=FSOperationStr[Integer(FSActions[i].ActionType)] + ' "' + FSActions[i].FirstPath + '"'; 888 | 889 | 890 | if FSActions[i].SecondPath <> '' then begin 891 | if FSActions[i].ActionType = ID_OPERATION_RENAME then 892 | LogLine:=LogLine + ' "' + ExtractFileName(FSActions[i].SecondPath) + '"' // Совместимость с командной строкой 893 | else 894 | LogLine:=LogLine + ' "' + FSActions[i].SecondPath + '"'; 895 | end; 896 | 897 | Result:=Result + LogLine + #13#10; 898 | end; 899 | end; 900 | 901 | procedure TMain.RunBtnClick(Sender: TObject); 902 | var 903 | i: integer; 904 | Item: TListItem; 905 | BackupStatusTitle: string; 906 | 907 | SuccessOperationsText, FailOperationsText: string; 908 | begin 909 | AllowAppClose:=false; // Запрещаем закрытие приложения 910 | StopRequest:=false; 911 | ProgressBar.Position:=0; 912 | RunBtn.Enabled:=false; 913 | CreateBtn.Enabled:=false; 914 | OpenBtn.Enabled:=false; 915 | OpenBtn2.Enabled:=false; 916 | RemSelectionBtn.Enabled:=false; 917 | SelectAllBtn.Enabled:=false; 918 | AddBtn.Enabled:=false; 919 | AddBtn2.Enabled:=false; 920 | EditBtn.Enabled:=false; 921 | EditBtn2.Enabled:=false; 922 | MoveBtn.Enabled:=false; 923 | SettingsBtn.Enabled:=false; 924 | RemBtn.Enabled:=false; 925 | RemBtn2.Enabled:=false; 926 | ExcludeBtn.Enabled:=false; 927 | StopBtn.Enabled:=true; 928 | FilesCounter:=0; 929 | ActionGoodCounter:=0; 930 | GoodCopyFilesCounter:=0; 931 | GoodMoveFilesCounter:=0; 932 | GoodRenameFilesCounter:=0; 933 | GoodDeleteFilesCounter:=0; 934 | GoodMakeFoldersCounter:=0; 935 | GoodRemoveFoldersCounter:=0; 936 | BadCopyFilesCounter:=0; 937 | BadMoveFilesCounter:=0; 938 | BadRenameFilesCounter:=0; 939 | BadDeleteFilesCounter:=0; 940 | BadMakeFoldersCounter:=0; 941 | BadRemoveFoldersCounter:=0; 942 | //Actions.Clear; 943 | FSActions.Clear; 944 | ExcludeRenameFiles.Clear; 945 | 946 | for i:=0 to ListView.Items.Count - 1 do begin 947 | Item:=ListView.Items.Item[i]; 948 | if Item.Checked then begin 949 | CheckFilesDiff(Item.SubItems[1], Item.SubItems[2]); 950 | CheckRemoteFilesToRemove(Item.SubItems[1], Item.SubItems[2]); 951 | end; 952 | end; 953 | CheckRemoteFilesToMove; 954 | 955 | // Количество операций 956 | ActionGoodCounter:=FSActions.Count; 957 | 958 | // Если есть операции 959 | if FSActions.Count > 0 then begin 960 | 961 | // Обычный режим 962 | if SilentMode = false then begin 963 | 964 | StatusText(IDS_PERFORM_OPERATIONS, IDS_PERFORM_OPERATIONS); 965 | 966 | // Подтверждение выполнения операций 967 | if CheckLogShow then begin 968 | 969 | // Показываем логи 970 | LogsForm.Show; 971 | 972 | //LogsForm.LogsMemo.Text:=Actions.Text; 973 | LogsForm.LogsMemo.Text:=OutFSActions(); 974 | 975 | // Подтверждение операции 976 | case MessageBox(Handle, PChar(IDS_PERFORM_OPERATIONS), PChar(Caption), 35) of 977 | 6: begin 978 | // Если окно не закрыто, то закрываем его 979 | if LogsForm.Showing then 980 | LogsForm.Close; 981 | 982 | ActionsRun; 983 | end; 984 | 985 | end; 986 | 987 | // Без подтверждения выполнения операций 988 | end else 989 | ActionsRun; 990 | 991 | // Тихий режим 992 | end else 993 | ActionsRun; 994 | end; 995 | 996 | if (BadCopyFilesCounter > 0) or (BadMoveFilesCounter > 0) or (BadDeleteFilesCounter > 0) or (BadMakeFoldersCounter > 0) or (BadRemoveFoldersCounter > 0) then begin 997 | ProgressBar.Position:=0; 998 | StatusText(IDS_COMPLETED_ERROR, IDS_COMPLETED_ERROR); 999 | end else begin 1000 | StatusText(IDS_COMPLETED, IDS_COMPLETED); 1001 | //Actions.Clear; 1002 | FSActions.Clear; 1003 | end; 1004 | 1005 | RunBtn.Enabled:=true; 1006 | CreateBtn.Enabled:=true; 1007 | OpenBtn.Enabled:=true; 1008 | OpenBtn2.Enabled:=true; 1009 | RunBtn.Enabled:=true; 1010 | RemSelectionBtn.Enabled:=true; 1011 | SelectAllBtn.Enabled:=true; 1012 | AddBtn.Enabled:=true; 1013 | AddBtn2.Enabled:=true; 1014 | EditBtn.Enabled:=true; 1015 | EditBtn2.Enabled:=true; 1016 | MoveBtn.Enabled:=true; 1017 | SettingsBtn.Enabled:=true; 1018 | RemBtn.Enabled:=true; 1019 | RemBtn2.Enabled:=true; 1020 | ExcludeBtn.Enabled:=true; 1021 | StopBtn.Enabled:=false; 1022 | ProgressBar2.Position:=0; 1023 | AllowAppClose:=true; // Разрешаем закрытие приложения 1024 | 1025 | if (SilentMode = false) and (RequestCloseApp = false) then begin 1026 | 1027 | if (BadCopyFilesCounter = 0) and (BadMoveFilesCounter = 0) and (BadDeleteFilesCounter = 0) and (BadRenameFilesCounter = 0) and (BadRemoveFoldersCounter = 0) then 1028 | BackupStatusTitle:=IDS_BACKUP_COMPLETED 1029 | else 1030 | BackupStatusTitle:=IDS_BACKUP_FAILED; 1031 | 1032 | SuccessOperationsText:=''; 1033 | if GoodCopyFilesCounter > 0 then SuccessOperationsText:=IDS_SUCCESS_COPY_FILES + ' ' + IntToStr(GoodCopyFilesCounter) + #13#10; 1034 | if GoodMoveFilesCounter > 0 then SuccessOperationsText:=SuccessOperationsText + IDS_SUCCESS_MOVE_FILES + ' ' + IntToStr(GoodMoveFilesCounter) + #13#10; 1035 | if GoodRenameFilesCounter > 0 then SuccessOperationsText:=SuccessOperationsText + IDS_SUCCESS_RENAME_FILES + ' ' + IntToStr(GoodRenameFilesCounter) + #13#10; 1036 | if GoodDeleteFilesCounter > 0 then SuccessOperationsText:=SuccessOperationsText + IDS_SUCCESS_REMOVE_FILES + ' ' + IntToStr(GoodDeleteFilesCounter) + #13#10; 1037 | if GoodMakeFoldersCounter > 0 then SuccessOperationsText:=SuccessOperationsText + IDS_SUCCESS_CREATE_FOLDERS + ' ' + IntToStr(GoodMakeFoldersCounter) + #13#10; 1038 | if GoodRemoveFoldersCounter > 0 then SuccessOperationsText:=SuccessOperationsText + IDS_SUCCESS_REMOVE_FOLDERS + ' ' + IntToStr(GoodRemoveFoldersCounter); 1039 | if SuccessOperationsText <> '' then SuccessOperationsText:=#13#10#13#10 + Trim(SuccessOperationsText); 1040 | 1041 | FailOperationsText:=''; 1042 | if BadCopyFilesCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_COPY_FILES + ' ' + IntToStr(BadCopyFilesCounter) + #13#10; 1043 | if BadMoveFilesCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_MOVE_FILES + ' ' + IntToStr(BadMoveFilesCounter) + #13#10; 1044 | if BadRenameFilesCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_RENAME_FILES + ' ' + IntToStr(BadRenameFilesCounter) + #13#10; 1045 | if BadDeleteFilesCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_REMOVE_FILES + ' ' + IntToStr(BadDeleteFilesCounter) + #13#10; 1046 | if BadMakeFoldersCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_CREATE_FOLDERS + ' ' + IntToStr(BadMakeFoldersCounter) + #13#10; 1047 | if BadRemoveFoldersCounter > 0 then FailOperationsText:=FailOperationsText + IDS_FAIL_REMOVE_FOLDERS + ' ' + IntToStr(BadRemoveFoldersCounter); 1048 | if FailOperationsText <> '' then FailOperationsText:=#13#10#13#10 + Trim(FailOperationsText); 1049 | 1050 | Application.MessageBox(PChar(BackupStatusTitle + #13#10 + #13#10 + 1051 | IDS_CHECK_FILES + ' ' + IntToStr(FilesCounter) + #13#10 + IDS_TOTAL_OPERATIONS + ' ' + IntToStr(ActionGoodCounter) + 1052 | SuccessOperationsText + FailOperationsText ), 1053 | PChar(Caption), MB_ICONINFORMATION or MB_TOPMOST); 1054 | 1055 | {Application.MessageBox(PChar(BackupStatusTitle + #13#10 + #13#10 + 1056 | ID_CHECK_FILES + ' ' + IntToStr(FilesCounter) + #13#10 + ID_TOTAL_OPERATIONS + ' ' + IntToStr(ActionGoodCounter) + #13#10#13#10 + 1057 | ID_SUCCESS_COPY_FILES + ' ' + IntToStr(GoodCopyFilesCounter) + #13#10 + 1058 | ID_SUCCESS_MOVE_FILES + ' ' + IntToStr(GoodMoveFilesCounter) + #13#10 + 1059 | ID_SUCCESS_RENAME_FILES + ' ' + IntToStr(GoodRenameFilesCounter) + #13#10 + 1060 | ID_SUCCESS_REMOVE_FILES + ' ' + IntToStr(GoodDeleteFilesCounter) + #13#10 + 1061 | ID_SUCCESS_CREATE_FOLDERS + ' ' + IntToStr(GoodMakeFoldersCounter) + #13#10 + 1062 | ID_SUCCESS_REMOVE_FOLDERS + ' ' + IntToStr(GoodRemoveFoldersCounter) + #13#10#13#10 + 1063 | ID_FAIL_COPY_FILES + ' ' + IntToStr(BadCopyFilesCounter) + #13#10 + 1064 | ID_FAIL_MOVE_FILES + ' ' + IntToStr(BadMoveFilesCounter) + #13#10 + 1065 | ID_FAIL_RENAME_FILES + ' ' + IntToStr(BadRenameFilesCounter) + #13#10 + 1066 | ID_FAIL_REMOVE_FILES + ' ' + IntToStr(BadDeleteFilesCounter) + #13#10 + 1067 | ID_FAIL_CREATE_FOLDERS + ' ' + IntToStr(BadMakeFoldersCounter) + #13#10 + 1068 | ID_FAIL_REMOVE_FOLDERS + ' ' + IntToStr(BadRemoveFoldersCounter) ), 1069 | PChar(Caption), MB_ICONINFORMATION or MB_TOPMOST);} 1070 | 1071 | if FSActions.Count > 0 then begin // Выводим проблемные операции 1072 | LogsForm.Show; 1073 | //for i:=Actions.Count - 1 downto 0 do 1074 | //if Actions.Strings[i] = '' then 1075 | //Actions.Delete(i); 1076 | //LogsForm.LogsMemo.Text:=Actions.Text; 1077 | 1078 | LogsForm.LogsMemo.Text:=OutFSActions(); 1079 | 1080 | end; 1081 | 1082 | 1083 | 1084 | end else if Trim(NotificationApp) <> '' then begin 1085 | 1086 | if (BadCopyFilesCounter = 0) and (BadMoveFilesCounter = 0) and (BadDeleteFilesCounter = 0) and (BadRenameFilesCounter = 0) and (BadRemoveFoldersCounter = 0) then 1087 | ShellExecute(0, 'open', PChar(NotificationApp), PChar('-t "' + Caption + '" -d "' + IDS_SUCCESS_NOTIFICATION_MESSAGE + '" -b EchoBackaper.png -c 1'), nil, SW_SHOWNORMAL) 1088 | else 1089 | ShellExecute(0, 'open', PChar(NotificationApp), PChar('-t "' + Caption + '" -d "' + IDS_FAIL_NOTIFICATION_MESSAGE + '" -b EchoBackaper.png -c 1'), nil, SW_SHOWNORMAL); 1090 | end; 1091 | 1092 | if RequestCloseApp then Close; 1093 | end; 1094 | 1095 | function TMain.BrowseFolderDialog(Title: PChar; Flags: Cardinal): string; 1096 | var 1097 | TitleName: string; 1098 | lpItemid: pItemIdList; 1099 | BrowseInfo: TBrowseInfo; 1100 | DisplayName: array[0..MAX_PATH] of Char; 1101 | TempPath: array[0..MAX_PATH] of Char; 1102 | begin 1103 | FillChar(BrowseInfo, SizeOf(TBrowseInfo), #0); 1104 | BrowseInfo.hwndOwner:=GetDesktopWindow; 1105 | BrowseInfo.pSzDisplayName:=@DisplayName; 1106 | TitleName:=Title; 1107 | BrowseInfo.lpSzTitle:=PChar(TitleName); 1108 | BrowseInfo.ulFlags:=Flags; // BIF_RETURNONLYFSDIRS 1109 | lpItemId:=shBrowseForFolder(BrowseInfo); 1110 | if lpItemId <> nil then begin 1111 | shGetPathFromIdList(lpItemId, TempPath); 1112 | Result:=TempPath; 1113 | GlobalFreePtr(lpItemId); 1114 | end; 1115 | end; 1116 | 1117 | procedure TMain.OpenBtn2Click(Sender: TObject); 1118 | begin 1119 | OpenBtn.Click; 1120 | end; 1121 | 1122 | procedure TMain.OpenBtnClick(Sender: TObject); 1123 | var 1124 | Ini: TIniFile; 1125 | begin 1126 | if not OpenDialog.Execute then Exit; 1127 | LoadBackupPaths(OpenDialog.FileName); 1128 | Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini'); 1129 | Ini.WriteString('Main', 'BackupFilesFolder', ExtractFilePath(OpenDialog.FileName)); // Сохраняем последний выбранный каталог 1130 | Ini.Free; 1131 | end; 1132 | 1133 | procedure TMain.CreateBtnClick(Sender: TObject); 1134 | begin 1135 | if SaveDialog.Execute then begin 1136 | CurrentBackupFilePath:=SaveDialog.FileName; 1137 | // Очищаем текущие пути 1138 | ListView.Clear; 1139 | ExcludePaths.Clear; 1140 | end; 1141 | end; 1142 | 1143 | procedure TMain.LoadBackupPaths(FileName: string); 1144 | var 1145 | i: integer; 1146 | Item: TListItem; BackupPaths: TStringList; Str: string; 1147 | LoadExcludePaths: boolean; 1148 | begin 1149 | // Очищаем текущие пути 1150 | ListView.Clear; 1151 | ExcludePaths.Clear; 1152 | 1153 | BackupPaths:=TStringList.Create; 1154 | LoadExcludePaths:=false; 1155 | 1156 | if FileExists(FileName) then begin 1157 | BackupPaths.LoadFromFile(FileName); 1158 | 1159 | // Сохраняем текущий путь для сохранения 1160 | CurrentBackupFilePath:=FileName; 1161 | end else 1162 | // Если файл не найден, то читаем дефолтный файл 1163 | CurrentBackupFilePath:=ExtractFilePath(ParamStr(0)) + BACKUP_PATHS_FILE_NAME; 1164 | 1165 | 1166 | for i:=1 to BackupPaths.Count - 1 do begin // Первая строка зарезервирована под "PAIR FOLDERS:" 1167 | if BackupPaths.Strings[i] = EXCLUDE_PATHS_FILE then begin 1168 | LoadExcludePaths:=true; 1169 | Continue; 1170 | end; 1171 | 1172 | if LoadExcludePaths = false then begin 1173 | Str:=BackupPaths.Strings[i]; 1174 | Item:=Main.ListView.Items.Add; 1175 | Item.Caption:=''; 1176 | Item.SubItems.Add(Copy(Str, 1, Pos(#9, Str) - 1)); 1177 | Delete(Str, 1, Pos(#9, Str)); 1178 | Item.SubItems.Add(Copy(Str, 1, Pos(#9, Str) - 1)); 1179 | Delete(Str, 1, Pos(#9, Str)); 1180 | Item.SubItems.Add(Str); 1181 | Item.Checked:=true; 1182 | end else 1183 | if Trim(BackupPaths.Strings[i]) <> '' then 1184 | ExcludePaths.Add(BackupPaths.Strings[i]); 1185 | end; 1186 | BackupPaths.Free; 1187 | end; 1188 | 1189 | procedure TMain.EditBtn2Click(Sender: TObject); 1190 | begin 1191 | EditBtn.Click; 1192 | end; 1193 | 1194 | procedure TMain.EditBtnClick(Sender: TObject); 1195 | var 1196 | Item: TListItem; NameFolders, LeftFolder, RightFolder: string; 1197 | begin 1198 | if ListView.ItemIndex = -1 then Exit; 1199 | Item:=ListView.Items.Item[ListView.ItemIndex]; 1200 | 1201 | NameFolders:=InputBox(Caption, IDS_ENTER_NAME_PAIR_FOLDERS, Item.SubItems[0]); 1202 | 1203 | if Trim(NameFolders) <> '' then begin 1204 | LeftFolder:=BrowseFolderDialog(PChar(IDS_CHOOSE_LEFT_FOLDER), BIF_RETURNONLYFSDIRS); 1205 | 1206 | if LeftFolder <> '' then 1207 | Item.SubItems[1]:=LeftFolder; 1208 | 1209 | RightFolder:=BrowseFolderDialog(PChar(IDS_CHOOSE_RIGHT_FOLDER), BIF_RETURNONLYFSDIRS or BIF_USENEWUI); 1210 | if RightFolder <> '' then 1211 | Item.SubItems[2]:=RightFolder; 1212 | 1213 | Item.SubItems[0]:=NameFolders; 1214 | SaveBackupPaths; 1215 | end else 1216 | Exit; // Выходим если название не введено 1217 | end; 1218 | 1219 | procedure TMain.ExcludeBtnClick(Sender: TObject); 1220 | begin 1221 | ExcludeFoldersForm.ShowModal; 1222 | end; 1223 | 1224 | procedure TMain.ExitBtnClick(Sender: TObject); 1225 | begin 1226 | Close; 1227 | end; 1228 | 1229 | procedure TMain.SaveBackupPaths; 1230 | var 1231 | i: integer; 1232 | Item: TListItem; 1233 | BackupPaths: TStringList; 1234 | begin 1235 | BackupPaths:=TStringList.Create; 1236 | 1237 | // Добавляем связанные папки 1238 | BackupPaths.Add(PAIR_FOLDERS_FILE); 1239 | for i:=0 to ListView.Items.Count - 1 do begin 1240 | Item:=ListView.Items.Item[i]; 1241 | BackupPaths.Add(Item.SubItems[0]+ #9 + Item.SubItems[1] + #9 + Item.SubItems[2]); 1242 | end; 1243 | 1244 | // Добавляем исключённые пути 1245 | BackupPaths.Add(EXCLUDE_PATHS_FILE); 1246 | BackupPaths.Add(Trim(ExcludePaths.Text)); 1247 | 1248 | BackupPaths.SaveToFile(CurrentBackupFilePath); // Сохраняем в текущий открытый файл 1249 | BackupPaths.Free; 1250 | end; 1251 | 1252 | procedure TMain.SettingsBtnClick(Sender: TObject); 1253 | begin 1254 | Settings.ShowModal; 1255 | end; 1256 | 1257 | procedure TMain.AddBtn2Click(Sender: TObject); 1258 | begin 1259 | AddBtn.Click; 1260 | end; 1261 | 1262 | procedure TMain.AddBtnClick(Sender: TObject); 1263 | var 1264 | Item: TListItem; NameFolders, LeftFolder, RightFolder: string; 1265 | begin 1266 | NameFolders:=''; 1267 | LeftFolder:=''; 1268 | RightFolder:=''; 1269 | 1270 | InputQuery(Caption, IDS_ENTER_NAME_PAIR_FOLDERS, NameFolders); 1271 | 1272 | if Trim(NameFolders) <> '' then begin 1273 | LeftFolder:=BrowseFolderDialog(PChar(IDS_CHOOSE_LEFT_FOLDER), BIF_RETURNONLYFSDIRS); 1274 | 1275 | if LeftFolder <> '' then 1276 | RightFolder:=BrowseFolderDialog(PChar(IDS_CHOOSE_RIGHT_FOLDER), BIF_RETURNONLYFSDIRS or BIF_USENEWUI); 1277 | end else 1278 | Exit; // Выходим если название не введено 1279 | 1280 | if (LeftFolder <> '') and (RightFolder <> '') then begin 1281 | Item:=Main.ListView.Items.Add; 1282 | Item.Caption:=''; 1283 | Item.SubItems.Add(NameFolders); 1284 | Item.SubItems.Add(LeftFolder); 1285 | Item.SubItems.Add(RightFolder); 1286 | Item.Checked:=true; 1287 | SaveBackupPaths; 1288 | end else 1289 | Application.MessageBox(PChar(IDS_CHOOSE_FOLDER_ERROR), PChar(Caption), MB_ICONWARNING); 1290 | end; 1291 | 1292 | procedure TMain.RemBtn2Click(Sender: TObject); 1293 | begin 1294 | RemBtn.Click; 1295 | end; 1296 | 1297 | procedure TMain.RemBtnClick(Sender: TObject); 1298 | begin 1299 | if ListView.ItemIndex <> -1 then begin 1300 | ListView.DeleteSelected; 1301 | SaveBackupPaths; 1302 | end; 1303 | end; 1304 | 1305 | procedure TMain.RemSelectionBtnClick(Sender: TObject); 1306 | var 1307 | i: integer; 1308 | Item: TListItem; 1309 | begin 1310 | for i:=0 to ListView.Items.Count - 1 do begin 1311 | Item:=ListView.Items.Item[i]; 1312 | Item.Checked:=false; 1313 | end; 1314 | end; 1315 | 1316 | procedure TMain.RightFolderBtnClick(Sender: TObject); 1317 | var 1318 | Item: TListItem; 1319 | begin 1320 | if ListView.ItemIndex = -1 then Exit; 1321 | Item:=ListView.Items.Item[ListView.ItemIndex]; 1322 | ShellExecute(0, 'open', 'explorer', PChar('/select, "' + Item.SubItems[2] + '"'), nil, SW_SHOW); 1323 | end; 1324 | 1325 | procedure TMain.LeftFolderBtnClick(Sender: TObject); 1326 | var 1327 | Item: TListItem; 1328 | begin 1329 | if ListView.ItemIndex = -1 then Exit; 1330 | Item:=ListView.Items.Item[ListView.ItemIndex]; 1331 | ShellExecute(0, 'open', 'explorer', PChar('/select, "' + Item.SubItems[1] + '"'), nil, SW_SHOW); 1332 | end; 1333 | 1334 | procedure TMain.ListViewDblClick(Sender: TObject); 1335 | var 1336 | Item: TListItem; 1337 | begin 1338 | if ListView.ItemIndex = -1 then Exit; 1339 | Item:=ListView.Items.Item[ListView.ItemIndex]; 1340 | Application.MessageBox(PChar(ListView.Columns[2].Caption + ': ' + Item.SubItems[1] + #13#10 + ListView.Columns[3].Caption + ': ' + Item.SubItems[2]), PChar(Item.SubItems[0]), MB_ICONINFORMATION); 1341 | end; 1342 | 1343 | procedure TMain.ListViewKeyDown(Sender: TObject; var Key: Word; 1344 | Shift: TShiftState); 1345 | begin 1346 | if Key = VK_DELETE then begin 1347 | RemBtn.Click; 1348 | SaveBackupPaths; 1349 | end; 1350 | end; 1351 | 1352 | procedure TMain.ListViewMouseDown(Sender: TObject; Button: TMouseButton; 1353 | Shift: TShiftState; X, Y: Integer); 1354 | begin 1355 | if Button = mbRight then 1356 | ListViewPM.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); 1357 | end; 1358 | 1359 | procedure TMain.StopBtnClick(Sender: TObject); 1360 | begin 1361 | StopRequest:=true; 1362 | end; 1363 | 1364 | procedure TMain.UpBtnClick(Sender: TObject); 1365 | var 1366 | ItemDown, ItemUp: TListItem; 1367 | ItemUpTitle, ItemUpPairFolders: string; 1368 | begin 1369 | if ListView.ItemIndex > 0 then begin 1370 | ItemUp:=ListView.Items.Item[ListView.ItemIndex - 1]; 1371 | ItemDown:=ListView.Items.Item[ListView.ItemIndex]; 1372 | 1373 | ItemUpTitle:=ItemUp.Caption; 1374 | ItemUpPairFolders:=ItemUp.SubItems.Text; 1375 | 1376 | ItemUp.Caption:=ItemDown.Caption; 1377 | ItemUp.SubItems.Text:=ItemDown.SubItems.Text; 1378 | 1379 | ItemDown.Caption:=ItemUpTitle; 1380 | ItemDown.SubItems.Text:=ItemUpPairFolders; 1381 | 1382 | ListView.ItemIndex:=ListView.ItemIndex - 1; 1383 | 1384 | SaveBackupPaths; 1385 | end; 1386 | end; 1387 | 1388 | procedure TMain.DownBtnClick(Sender: TObject); 1389 | var 1390 | ItemDown, ItemUp: TListItem; 1391 | ItemUpTitle, ItemUpPairFolders: string; 1392 | begin 1393 | if (ListView.ItemIndex <> -1) and (ListView.ItemIndex < ListView.Items.Count - 1) then begin 1394 | 1395 | ItemUp:=ListView.Items.Item[ListView.ItemIndex]; 1396 | ItemDown:=ListView.Items.Item[ListView.ItemIndex + 1]; 1397 | 1398 | ItemUpTitle:=ItemUp.Caption; 1399 | ItemUpPairFolders:=ItemUp.SubItems.Text; 1400 | 1401 | ItemUp.Caption:=ItemDown.Caption; 1402 | ItemUp.SubItems.Text:=ItemDown.SubItems.Text; 1403 | 1404 | ItemDown.Caption:=ItemUpTitle; 1405 | ItemDown.SubItems.Text:=ItemUpPairFolders; 1406 | 1407 | ListView.ItemIndex:=ListView.ItemIndex + 1; 1408 | 1409 | SaveBackupPaths; 1410 | end; 1411 | end; 1412 | 1413 | procedure TMain.AboutBtnClick(Sender: TObject); 1414 | begin 1415 | Application.MessageBox(PChar(Caption + ' 1.0.3' + #13#10 + 1416 | IDS_LAST_UPDATE + ' 12.02.25' + #13#10 + 1417 | 'https://r57zone.github.io' + #13#10 + 1418 | 'r57zone@gmail.com'), PChar(IDS_ABOUT_TITLE), MB_ICONINFORMATION); 1419 | end; 1420 | 1421 | end. 1422 | -------------------------------------------------------------------------------- /Source/Unit2.dfm: -------------------------------------------------------------------------------- 1 | object ExcludeFoldersForm: TExcludeFoldersForm 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsSingle 5 | Caption = #1048#1089#1082#1083#1102#1095#1077#1085#1080#1077' '#1087#1072#1087#1086#1082 6 | ClientHeight = 296 7 | ClientWidth = 374 8 | Color = clBtnFace 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Tahoma' 13 | Font.Style = [] 14 | Menu = MainMenu 15 | Position = poScreenCenter 16 | OnCreate = FormCreate 17 | TextHeight = 13 18 | object ListBox: TListBox 19 | Left = 0 20 | Top = 0 21 | Width = 374 22 | Height = 255 23 | Align = alClient 24 | ItemHeight = 13 25 | TabOrder = 0 26 | OnKeyDown = ListBoxKeyDown 27 | OnMouseDown = ListBoxMouseDown 28 | ExplicitWidth = 370 29 | ExplicitHeight = 254 30 | end 31 | object Panel: TPanel 32 | Left = 0 33 | Top = 255 34 | Width = 374 35 | Height = 41 36 | Align = alBottom 37 | BevelOuter = bvNone 38 | TabOrder = 1 39 | ExplicitTop = 254 40 | ExplicitWidth = 370 41 | object OKBtn: TButton 42 | Left = 8 43 | Top = 8 44 | Width = 75 45 | Height = 25 46 | Caption = #1054#1050 47 | TabOrder = 0 48 | OnClick = OKBtnClick 49 | end 50 | object CancelBtn: TButton 51 | Left = 89 52 | Top = 8 53 | Width = 75 54 | Height = 25 55 | Caption = #1054#1090#1084#1077#1085#1072 56 | TabOrder = 1 57 | OnClick = CancelBtnClick 58 | end 59 | end 60 | object PopupMenu: TPopupMenu 61 | Left = 104 62 | Top = 16 63 | object AddBtn2: TMenuItem 64 | Caption = #1044#1086#1073#1072#1074#1080#1090#1100 65 | OnClick = AddBtn2Click 66 | end 67 | object EditBtn2: TMenuItem 68 | Caption = #1048#1079#1084#1077#1085#1080#1090#1100 69 | OnClick = EditBtn2Click 70 | end 71 | object LineNoneBtn: TMenuItem 72 | Caption = '-' 73 | end 74 | object RemBtn2: TMenuItem 75 | Caption = #1059#1076#1072#1083#1080#1090#1100 76 | OnClick = RemBtn2Click 77 | end 78 | end 79 | object MainMenu: TMainMenu 80 | Left = 32 81 | Top = 16 82 | object FileBtn: TMenuItem 83 | Caption = #1060#1072#1081#1083 84 | object ExitBtn: TMenuItem 85 | Caption = #1042#1099#1093#1086#1076 86 | ShortCut = 32883 87 | OnClick = ExitBtnClick 88 | end 89 | end 90 | object FoldersBtn: TMenuItem 91 | Caption = #1055#1072#1087#1082#1080 92 | object AddBtn: TMenuItem 93 | Caption = #1044#1086#1073#1072#1074#1080#1090#1100 94 | ShortCut = 24641 95 | OnClick = AddBtnClick 96 | end 97 | object EditBtn: TMenuItem 98 | Caption = #1048#1079#1084#1077#1085#1080#1090#1100 99 | ShortCut = 24653 100 | OnClick = EditBtnClick 101 | end 102 | object N1: TMenuItem 103 | Caption = '-' 104 | end 105 | object RemBtn: TMenuItem 106 | Caption = #1059#1076#1072#1083#1080#1090#1100 107 | ShortCut = 24658 108 | OnClick = RemBtnClick 109 | end 110 | end 111 | end 112 | end 113 | -------------------------------------------------------------------------------- /Source/Unit2.pas: -------------------------------------------------------------------------------- 1 | unit Unit2; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus, ShlObj; 8 | 9 | type 10 | TExcludeFoldersForm = class(TForm) 11 | ListBox: TListBox; 12 | Panel: TPanel; 13 | OKBtn: TButton; 14 | CancelBtn: TButton; 15 | PopupMenu: TPopupMenu; 16 | AddBtn2: TMenuItem; 17 | RemBtn2: TMenuItem; 18 | LineNoneBtn: TMenuItem; 19 | MainMenu: TMainMenu; 20 | FileBtn: TMenuItem; 21 | ExitBtn: TMenuItem; 22 | FoldersBtn: TMenuItem; 23 | AddBtn: TMenuItem; 24 | RemBtn: TMenuItem; 25 | EditBtn: TMenuItem; 26 | N1: TMenuItem; 27 | EditBtn2: TMenuItem; 28 | procedure AddBtn2Click(Sender: TObject); 29 | procedure RemBtn2Click(Sender: TObject); 30 | procedure OKBtnClick(Sender: TObject); 31 | procedure CancelBtnClick(Sender: TObject); 32 | procedure FormCreate(Sender: TObject); 33 | procedure ListBoxKeyDown(Sender: TObject; var Key: Word; 34 | Shift: TShiftState); 35 | procedure ListBoxMouseDown(Sender: TObject; Button: TMouseButton; 36 | Shift: TShiftState; X, Y: Integer); 37 | procedure AddBtnClick(Sender: TObject); 38 | procedure RemBtnClick(Sender: TObject); 39 | procedure ExitBtnClick(Sender: TObject); 40 | procedure EditBtnClick(Sender: TObject); 41 | procedure EditBtn2Click(Sender: TObject); 42 | private 43 | { Private declarations } 44 | public 45 | { Public declarations } 46 | end; 47 | 48 | var 49 | ExcludeFoldersForm: TExcludeFoldersForm; 50 | 51 | implementation 52 | 53 | {$R *.dfm} 54 | 55 | uses Unit1; 56 | 57 | procedure TExcludeFoldersForm.AddBtn2Click(Sender: TObject); 58 | begin 59 | AddBtn.Click; 60 | end; 61 | 62 | procedure TExcludeFoldersForm.RemBtn2Click(Sender: TObject); 63 | begin 64 | RemBtn.Click; 65 | end; 66 | 67 | procedure TExcludeFoldersForm.RemBtnClick(Sender: TObject); 68 | begin 69 | if ListBox.ItemIndex <> -1 then 70 | ListBox.DeleteSelected; 71 | end; 72 | 73 | procedure TExcludeFoldersForm.OKBtnClick(Sender: TObject); 74 | begin 75 | ExcludePaths.Text:=ListBox.Items.Text; 76 | Main.SaveBackupPaths; 77 | Close; 78 | end; 79 | 80 | procedure TExcludeFoldersForm.AddBtnClick(Sender: TObject); 81 | var 82 | ExcludePath: string; 83 | begin 84 | ExcludePath:=Main.BrowseFolderDialog(PChar(IDS_SELECT_EXCLUDE_FOLDER), BIF_RETURNONLYFSDIRS or BIF_USENEWUI); 85 | if (ExcludePath <> '') and (Pos(ExcludePath + #13#10, ListBox.Items.Text) = 0) then 86 | ListBox.Items.Add(ExcludePath); 87 | end; 88 | 89 | procedure TExcludeFoldersForm.CancelBtnClick(Sender: TObject); 90 | begin 91 | Close; 92 | end; 93 | 94 | procedure TExcludeFoldersForm.EditBtn2Click(Sender: TObject); 95 | begin 96 | EditBtn.Click; 97 | end; 98 | 99 | procedure TExcludeFoldersForm.EditBtnClick(Sender: TObject); 100 | var 101 | ExcludePath: string; 102 | begin 103 | if ListBox.ItemIndex = -1 then Exit; 104 | ExcludePath:=Main.BrowseFolderDialog(PChar(IDS_SELECT_EXCLUDE_FOLDER), BIF_RETURNONLYFSDIRS or BIF_USENEWUI); 105 | if (ExcludePath <> '') and (Pos(ExcludePath + #13#10, ListBox.Items.Text) = 0) then 106 | ListBox.Items.Strings[ListBox.ItemIndex]:=ExcludePath; 107 | end; 108 | 109 | procedure TExcludeFoldersForm.ExitBtnClick(Sender: TObject); 110 | begin 111 | Close; 112 | end; 113 | 114 | procedure TExcludeFoldersForm.FormCreate(Sender: TObject); 115 | begin 116 | ListBox.Items.Text:=ExcludePaths.Text; 117 | Caption:=IDS_EXCLUDE_TITLE; 118 | FileBtn.Caption:=Main.FileBtn.Caption; 119 | ExitBtn.Caption:=Main.ExitBtn.Caption; 120 | FoldersBtn.Caption:=Main.FoldersBtn.Caption; 121 | AddBtn.Caption:=Main.AddBtn.Caption; 122 | AddBtn2.Caption:=AddBtn.Caption; 123 | EditBtn.Caption:=Main.EditBtn.Caption; 124 | EditBtn2.Caption:=EditBtn.Caption; 125 | RemBtn.Caption:=Main.RemBtn.Caption; 126 | RemBtn2.Caption:=RemBtn.Caption; 127 | OkBtn.Caption:=IDS_OK; 128 | CancelBtn.Caption:=IDS_CANCEL; 129 | end; 130 | 131 | procedure TExcludeFoldersForm.ListBoxKeyDown(Sender: TObject; var Key: Word; 132 | Shift: TShiftState); 133 | begin 134 | if Key = VK_DELETE then begin 135 | RemBtn.Click; 136 | Main.SaveBackupPaths; 137 | end; 138 | end; 139 | 140 | procedure TExcludeFoldersForm.ListBoxMouseDown(Sender: TObject; 141 | Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 142 | begin 143 | if Button = mbRight then 144 | PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y); 145 | end; 146 | 147 | end. 148 | -------------------------------------------------------------------------------- /Source/Unit3.dfm: -------------------------------------------------------------------------------- 1 | object LogsForm: TLogsForm 2 | Left = 0 3 | Top = 0 4 | ClientHeight = 230 5 | ClientWidth = 400 6 | Color = clBtnFace 7 | Font.Charset = DEFAULT_CHARSET 8 | Font.Color = clWindowText 9 | Font.Height = -11 10 | Font.Name = 'Tahoma' 11 | Font.Style = [] 12 | Menu = MainMenu 13 | Position = poScreenCenter 14 | OnCreate = FormCreate 15 | TextHeight = 13 16 | object LogsMemo: TMemo 17 | Left = 0 18 | Top = 0 19 | Width = 400 20 | Height = 230 21 | Align = alClient 22 | ReadOnly = True 23 | ScrollBars = ssBoth 24 | TabOrder = 0 25 | ExplicitWidth = 396 26 | ExplicitHeight = 229 27 | end 28 | object MainMenu: TMainMenu 29 | Left = 24 30 | Top = 8 31 | object FileBtn: TMenuItem 32 | Caption = #1060#1072#1081#1083 33 | object SaveAsBtn: TMenuItem 34 | Caption = #1057#1086#1093#1088#1072#1085#1080#1090#1100' '#1082#1072#1082'...' 35 | ShortCut = 24659 36 | OnClick = SaveAsBtnClick 37 | end 38 | object N3: TMenuItem 39 | Caption = '-' 40 | end 41 | object ExitBtn: TMenuItem 42 | Caption = #1042#1099#1093#1086#1076 43 | ShortCut = 32883 44 | OnClick = ExitBtnClick 45 | end 46 | end 47 | end 48 | object SaveDialog: TSaveDialog 49 | DefaultExt = 'Batch files (*.bat)|*.bat|Text files (*.txt)|*.txt' 50 | Filter = 'Batch files (*.bat)|*.bat|Text files (*.txt)|*.txt' 51 | Left = 92 52 | Top = 8 53 | end 54 | end 55 | -------------------------------------------------------------------------------- /Source/Unit3.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/r57zone/EchoBackuper/a8baa775ae82c4fce0067f3992ee4b841464e390/Source/Unit3.pas -------------------------------------------------------------------------------- /Source/Unit4.dfm: -------------------------------------------------------------------------------- 1 | object Settings: TSettings 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu, biMinimize] 5 | BorderStyle = bsSingle 6 | Caption = #1053#1072#1089#1090#1088#1086#1081#1082#1080 7 | ClientHeight = 165 8 | ClientWidth = 367 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -12 13 | Font.Name = 'Segoe UI' 14 | Font.Style = [] 15 | Position = poScreenCenter 16 | OnCreate = FormCreate 17 | OnShow = FormShow 18 | TextHeight = 15 19 | object PanelBtns: TPanel 20 | Left = 0 21 | Top = 124 22 | Width = 367 23 | Height = 41 24 | Align = alBottom 25 | BevelOuter = bvSpace 26 | TabOrder = 4 27 | object OkBtn: TButton 28 | Left = 8 29 | Top = 8 30 | Width = 75 31 | Height = 25 32 | Caption = #1054#1050 33 | TabOrder = 0 34 | OnClick = OkBtnClick 35 | end 36 | object CancelBtn: TButton 37 | Left = 89 38 | Top = 8 39 | Width = 75 40 | Height = 25 41 | Caption = #1054#1090#1084#1077#1085#1072 42 | TabOrder = 1 43 | OnClick = CancelBtnClick 44 | end 45 | end 46 | object CheckLogCB: TCheckBox 47 | Left = 8 48 | Top = 8 49 | Width = 225 50 | Height = 17 51 | Caption = #1055#1088#1086#1089#1084#1086#1090#1088' '#1079#1072#1076#1072#1095' '#1087#1077#1088#1077#1076' '#1086#1087#1077#1088#1072#1094#1080#1103#1084#1080 52 | Checked = True 53 | State = cbChecked 54 | TabOrder = 0 55 | end 56 | object CheckSumVerificationCopyCB: TCheckBox 57 | Left = 8 58 | Top = 39 59 | Width = 313 60 | Height = 17 61 | Caption = #1055#1088#1086#1074#1077#1088#1082#1072' '#1082#1086#1085#1090#1088#1086#1083#1100#1085#1086#1081' '#1089#1091#1084#1084#1099' '#1087#1086#1089#1083#1077' '#1082#1086#1087#1080#1088#1086#1074#1072#1085#1080#1103 62 | TabOrder = 1 63 | end 64 | object CopyCreationDateCB: TCheckBox 65 | Left = 8 66 | Top = 70 67 | Width = 313 68 | Height = 17 69 | Caption = #1057#1086#1093#1088#1072#1085#1103#1090#1100' '#1076#1072#1090#1091' '#1089#1086#1079#1076#1072#1085#1080#1103' '#1092#1072#1081#1083#1086#1074' '#1087#1088#1080' '#1082#1086#1087#1080#1088#1086#1074#1072#1085#1080#1080 70 | TabOrder = 2 71 | end 72 | object CopyFileAttrCB: TCheckBox 73 | Left = 8 74 | Top = 101 75 | Width = 281 76 | Height = 17 77 | Caption = #1057#1086#1093#1088#1072#1085#1103#1090#1100' '#1072#1090#1088#1080#1073#1091#1090#1099' '#1092#1072#1081#1083#1086#1074' '#1087#1088#1080' '#1082#1086#1087#1080#1088#1086#1074#1072#1085#1080#1080 78 | TabOrder = 3 79 | end 80 | end 81 | -------------------------------------------------------------------------------- /Source/Unit4.pas: -------------------------------------------------------------------------------- 1 | unit Unit4; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, IniFiles; 8 | 9 | type 10 | TSettings = class(TForm) 11 | PanelBtns: TPanel; 12 | CheckLogCB: TCheckBox; 13 | OkBtn: TButton; 14 | CancelBtn: TButton; 15 | CheckSumVerificationCopyCB: TCheckBox; 16 | CopyCreationDateCB: TCheckBox; 17 | CopyFileAttrCB: TCheckBox; 18 | procedure OkBtnClick(Sender: TObject); 19 | procedure FormCreate(Sender: TObject); 20 | procedure CancelBtnClick(Sender: TObject); 21 | procedure FormShow(Sender: TObject); 22 | private 23 | { Private declarations } 24 | public 25 | { Public declarations } 26 | end; 27 | 28 | var 29 | Settings: TSettings; 30 | 31 | implementation 32 | 33 | {$R *.dfm} 34 | 35 | uses Unit1; 36 | 37 | procedure TSettings.OkBtnClick(Sender: TObject); 38 | var 39 | Ini: TIniFile; 40 | begin 41 | CheckLogShow:=CheckLogCB.Checked; 42 | CRCCopyCheck:=CheckSumVerificationCopyCB.Checked; 43 | WriteCreationDate:=CopyCreationDateCB.Checked; 44 | WriteAttributes:=CopyFileAttrCB.Checked; 45 | 46 | Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Config.ini'); 47 | Ini.WriteBool('Main', 'LookTasks', CheckLogShow); 48 | Ini.WriteBool('Main', 'CRCCopyCheck', CRCCopyCheck); 49 | Ini.WriteBool('Main', 'WriteCreationDate', WriteCreationDate); 50 | Ini.WriteBool('Main', 'WriteAttributes', WriteAttributes); 51 | 52 | Ini.Free; 53 | 54 | Close; 55 | end; 56 | 57 | procedure TSettings.CancelBtnClick(Sender: TObject); 58 | begin 59 | Close; 60 | end; 61 | 62 | procedure TSettings.FormCreate(Sender: TObject); 63 | begin 64 | Caption:=Main.SettingsBtn.Caption; 65 | CheckLogCB.Caption:=IDS_VIEW_TASKS; 66 | OkBtn.Caption:=IDS_OK; 67 | CancelBtn.Caption:=IDS_CANCEL; 68 | 69 | CheckSumVerificationCopyCB.Caption:=IDS_CHECKSUM_VERIFICATION_COPY; 70 | CopyCreationDateCB.Caption:=IDS_COPY_CREATION_DATE; 71 | CopyFileAttrCB.Caption:=IDS_COPY_FILE_ATTRIBUTES; 72 | end; 73 | 74 | procedure TSettings.FormShow(Sender: TObject); 75 | begin 76 | CheckLogCB.Checked:=CheckLogShow; 77 | CheckSumVerificationCopyCB.Checked:=CRCCopyCheck; 78 | CopyCreationDateCB.Checked:=WriteCreationDate; 79 | CopyFileAttrCB.Checked:=WriteAttributes; 80 | end; 81 | 82 | end. 83 | -------------------------------------------------------------------------------- /Source/clear.bat: -------------------------------------------------------------------------------- 1 | del *.obj 2 | del *.dcu 3 | del Win32\Release\*.dcu 4 | del Win32\Debug\*.dcu 5 | rd /s /q __recovery 6 | rd /s /q __history 7 | del *.~* 8 | del *.hpp 9 | del *.dcp 10 | del *.dpl 11 | del *.cesettings 12 | del *.bak 13 | del *.dproj.local 14 | del *.identcache 15 | --del *.exe 16 | --del Win32\Release\*.exe 17 | --del Win32\Debug\*.exe --------------------------------------------------------------------------------