209 lines
5.7 KiB
C
209 lines
5.7 KiB
C
/*
|
|
limpador do luca0N! 3
|
|
Copyright (C) 2020 luca0N!
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
Contact me by e-mail via <mailto:luca0n@protonmail.com>.
|
|
*/
|
|
#include "about.h"
|
|
#include "str.h"
|
|
#include "cfg.h"
|
|
// Because this program is currently target at Windows only, the use of ANSI colors are no longer used as of May 5, 2020.
|
|
// #include "colors.h"
|
|
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
// Removes a directory using the Windows shell
|
|
int shellRemoveDir(LPCTSTR dirPath){
|
|
// Remove the directory
|
|
//printf("!! ATTEMPT TO REMOVE (%d) %s\\...\n", len, shortPath);
|
|
|
|
// Append null to the end of the path
|
|
// Double null terminated path string
|
|
char dntps[strlen(dirPath) + 2];
|
|
strcpy(dntps, dirPath);
|
|
strcat(dntps, "\\\0");
|
|
|
|
SHFILEOPSTRUCT dir = {0};
|
|
dir.wFunc = FO_DELETE;
|
|
dir.pFrom = dntps;
|
|
dir.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI;
|
|
dir.fAnyOperationsAborted = 0;
|
|
/*dir = {
|
|
NULL,
|
|
FO_DELETE,
|
|
dntps,
|
|
NULL,
|
|
FOF_NOCONFIRMATION | FOF_NOERRORUI,
|
|
0,
|
|
0,
|
|
""
|
|
};*/
|
|
return SHFileOperation(&dir);
|
|
}
|
|
|
|
// Prints the program license to the user.
|
|
int printLicense(int full){
|
|
if (full == 0) {
|
|
printf("%s\n", LICENSE);
|
|
return 0;
|
|
} else {
|
|
FILE* flic = fopen(PATH_LICENSE, "r");
|
|
if (flic == NULL){
|
|
printf("%s\n", STR_ERROR_LIC);
|
|
return -1;
|
|
}
|
|
char c;
|
|
while ((c = fgetc(flic)) != EOF) {
|
|
printf("%c", c);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Gets the user defined directories
|
|
void getAdditionalDirs(){
|
|
printf("\n%s\n", STR_FETCHING_ADD_DIRS);
|
|
int dirs;
|
|
dirs = GetPrivateProfileInt("Pastas", "Pastas", 3, PATH_CFG);
|
|
printf("%s %d\n", STR_DIR_COUNT, dirs);
|
|
fflush(stdout);
|
|
for(unsigned short x = 0; x < dirs; x++){
|
|
char dirKey[7] = "Pasta";
|
|
char* intPtr = (x + 1) + '0';
|
|
strcat(dirKey, &intPtr);
|
|
_TCHAR currentPath[128];
|
|
GetPrivateProfileString("Pastas", dirKey, "null", currentPath,
|
|
sizeof(currentPath) / sizeof(currentPath[0]), PATH_CFG);
|
|
|
|
// Check if the specified path is an environment variable.
|
|
// If it starts with %, then we should treat it as such.
|
|
if (currentPath[0] == '%'){
|
|
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
WORD wColor;
|
|
CONSOLE_SCREEN_BUFFER_INFO info;
|
|
GetConsoleScreenBufferInfo(h, &info);
|
|
wColor = info.wAttributes;
|
|
|
|
SetConsoleTextAttribute(h, FOREGROUND_RED);
|
|
printf("%s\n\n", STR_ERROR_VAR_CURRENTLY_NOT_SUPPORTED);
|
|
SetConsoleTextAttribute(h, wColor);
|
|
/*char varBuffer[sizeof(currentPath)];
|
|
memcpy(varBuffer, ¤tPath[1], strlen(currentPath)-3);
|
|
varBuffer[sizeof(varBuffer)] = '\0';
|
|
|
|
char varResBuffer[32767];
|
|
GetEnvironmentVariable(
|
|
varBuffer,
|
|
&varResBuffer,
|
|
sizeof(varResBuffer)
|
|
);
|
|
printf("%s [%s] %s\n", STR_FOUND_DIR, dirKey, varResBuffer);
|
|
cleanDir(varResBuffer);*/
|
|
continue;
|
|
}
|
|
|
|
printf("%s [%s] %s\n", STR_FOUND_DIR, dirKey, currentPath);
|
|
|
|
cleanDir(currentPath);
|
|
}
|
|
}
|
|
|
|
// Cleans a directory.
|
|
void cleanDir(const char* path){
|
|
const char* validPath = path;
|
|
//char validPath[sizeof(path) + 1];
|
|
//strcpy(validPath, path);
|
|
/*// Check if the path ends with '\'
|
|
if (path[strlen(path)] != '\\'){
|
|
strcat(validPath, "\\");
|
|
}*/
|
|
|
|
// Path with wildcard
|
|
char wildPath[strlen(validPath) + 1];
|
|
strcpy(wildPath, validPath);
|
|
strcat(wildPath, "*");
|
|
|
|
printf("%s %s\n", STR_CLEANING_DIR, wildPath);
|
|
// Fetch files in dir
|
|
WIN32_FIND_DATA data;
|
|
HANDLE hFind = FindFirstFile(wildPath, &data);
|
|
unsigned int iteration = 0;
|
|
if (hFind != INVALID_HANDLE_VALUE){
|
|
do{
|
|
// Ignore pseudo dirs (. and ..)
|
|
iteration++;
|
|
if (iteration <= 2)
|
|
continue;
|
|
printf("%s %s\n", STR_FOUND_ITEM, data.cFileName);
|
|
// Attempt to delete item...
|
|
|
|
int pathSize = strlen(wildPath) + strlen(data.cFileName);
|
|
char fullPath[pathSize];
|
|
strcpy(fullPath, validPath);
|
|
strcat(fullPath, data.cFileName);
|
|
|
|
// If the item is a directory, then delete it through the shell
|
|
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
|
|
int shellReturnCode = shellRemoveDir(fullPath);
|
|
if (shellReturnCode != 0){
|
|
printf(" %s\n", STR_FAILED_DIR);
|
|
printf(" --> %s\n", fullPath);
|
|
printf(" --> %#010x\n", shellReturnCode);
|
|
}
|
|
continue;
|
|
}
|
|
|
|
if (DeleteFile(fullPath) == 0){
|
|
int lastError = GetLastError();
|
|
printf(" %s\n", STR_FAILED_FILE);
|
|
printf(" --> %s\n", fullPath);
|
|
printf(" --> %#010x\n", lastError);
|
|
} else
|
|
printf(" %s\n", STR_DELETED_FILE);
|
|
} while(FindNextFile(hFind, &data));
|
|
} else {
|
|
printf("%s\n", STR_FAILED_DIR_LIST);
|
|
}
|
|
}
|
|
|
|
int main(void){
|
|
SetConsoleOutputCP(CP_UTF8);
|
|
|
|
printLicense(0);
|
|
|
|
printf("%s\n%s %d, %s\n", STR_LN, PROGRAM_NAME, PROGRAM_SEASON, PROGRAM_VERSION);
|
|
printf("%s\n%s\n\n", PROGRAM_COPYRIGHT, STR_LN);
|
|
|
|
unsigned int ignoreWarning = GetPrivateProfileInt("Geral", "IgnorarAlerta", 0, PATH_CFG);
|
|
unsigned int licenseAccepted = GetPrivateProfileInt("Geral", "AceitarLicença", 0, PATH_CFG);
|
|
if (!ignoreWarning || !licenseAccepted){
|
|
printf("%s ", STR_USE_WARNING, ignoreWarning, licenseAccepted);
|
|
char in;
|
|
fflush(stdout);
|
|
|
|
scanf("%c", &in);
|
|
|
|
if (in == 'w' || in == 'c')
|
|
if (printLicense(1) != 0)
|
|
return -2;
|
|
if (in != 's' && in != 'S' && in != 'y' && in != 'Y')
|
|
return 0;
|
|
}
|
|
getAdditionalDirs();
|
|
return 0;
|
|
} |