Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Stergerea fisierelor copiate in Windows/C++
#1
Posted 26 July 2017 - 07:54
Salut,
As avea nevoie de o mica idee sau artificu daca exista asta ceva cu niste fisiere in C++. Am o functie recursiva care cauta toate fisierele dintr-un director. Daca fisierele se incadreaza in anumite regului ele trebuie mutate in alte foldere si path-ul vechi trebuie sters pentru a nu avea duplicate. Problema e ca nu pot utiliza MoveFile sau CopyFile cu DeleteFile (acelasi lucru cu move) pentru ca fisierele sunt folosite de procesul curent. Arata cam asa : if (0 == CopyFile(src, dest, ) { std::cout << " -> Copy Fail" << std::endl; outFile << " -> Copy Fail" << std::endl; } else { std::cout << " -> Copy Done" << std::endl; outFile << " -> Copy Done" << std::endl; cout << "value"; } Copy functioneaza, daca incerc delete sau move imi returneaza: ERROR_SHARING_VIOLATION 32 (0x20) The process cannot access the file because it is being used by another process.Am mai gasit ceva referitor la CreateFile ce poate marca fisierele pentru stergere dupa ce procesul s-a incheiat cu FILE_FLAG_DELETE_ON_CLOSE (https://msdn.microso...8(v=vs.85).aspx)cam asa: handle = CreateFile(src, NULL , FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);Insa bineinteles ca accesul este restrictionat si pentru CreateFile. Aveti vreo idee cum as putea sterge fisierele in contexul procesului curent? Edited by worm94, 26 July 2017 - 07:55. |
#2
Posted 26 July 2017 - 08:35
Nu stiu daca e nevoie de functia ta recursiva fiindca o are si sistemul de operare!
N-am inteles de ce tii fisierul deschis ca sa nu mearga MoveFile! Edited by neagu_laurentiu, 26 July 2017 - 08:35. |
#3
Posted 26 July 2017 - 10:17
Sunt multe api-uri in windows pentru asta, SHFileOperation e chiar ceea ce utilizeaza windows explorer ( sau ma rog IFileOperation ):
https://msdn.microso...4(v=vs.85).aspx Edited by modoran, 26 July 2017 - 10:18. |
#4
Posted 26 July 2017 - 11:10
neagu_laurentiu, on 26 iulie 2017 - 08:35, said:
Nu stiu daca e nevoie de functia ta recursiva fiindca o are si sistemul de operare! N-am inteles de ce tii fisierul deschis ca sa nu mearga MoveFile! Nu am cum sa-l opresc..daca fac asta o sa-mi ia doar primul fisier gasit.. Am simplificat putin din functie ca sa se inteleaga.. void parseFile::iterateThrowDirectory(const std::wstring & directory) { struct stat s; std::wstring tmp = directory + L"\\*"; WIN32_FIND_DATAW file; LPCWSTR partialresult;//the path converted to LPWSTR HANDLE search_handle = FindFirstFileW(tmp.c_str(), &file); if (search_handle != INVALID_HANDLE_VALUE) { std::vector<std::wstring> directories; do { if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((!lstrcmpW(file.cFileName, L".")) || (!lstrcmpW(file.cFileName, L"..")) continue; } tmp = directory + L"\\" + std::wstring(file.cFileName); //convert wstring to char* for stat std::wstring s2(tmp); char *str = new char[255]; sprintf(str, "%ls", s2.c_str()); //ASCII path partialresult = tmp.c_str(); //LPCWSTR path unsigned char* buffer = readByteFromFile(str, 0, 8); //patten read from current file //ceva ... if (0 == MoveFile(src, dest)) { //aici ar trebui sa fie move std::cout << " -> Copy Fail" << std::endl; // HANDLE search_handle = FindFirstFileW(tmp.c_str(), &file); daca il inchid se opreste dupa primul fisier outFile << " -> Copy Fail" << std::endl; } else { std::cout << " -> Copy Done" << std::endl; outFile << " -> Copy Done" << std::endl; handle = CreateFile(src, NULL, FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); DWORD err = GetLastError(); } if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) directories.push_back(tmp); delete str; str = nullptr; } while (FindNextFileW(search_handle, &file)); FindClose(search_handle); for (std::vector<std::wstring>::iterator iter = directories.begin(), end = directories.end(); iter != end; ++iter) iterateThrowDirectory(*iter); } Edited by worm94, 26 July 2017 - 11:11. |
#5
Posted 26 July 2017 - 12:04
Trebuie sa citesti acel fisier? Daca da, inchide-l macar si pe urma il muti cu MoveFile, nu trebuie CreateFile in poveste.
|
#6
Posted 26 July 2017 - 13:14
Cum arată funcția readByteFromFile()? Nu trebuie să închizi search_handle, ci să ai grijă să închizi fișierul "str" dacă acesta este deschis în readByteFromFile(str, ...).
|
#7
Posted 26 July 2017 - 13:18
Cu siguranta a lasat fisierul deschis in acea functie.
Edited by neagu_laurentiu, 26 July 2017 - 13:22. |
#8
Posted 26 July 2017 - 17:57
neagu_laurentiu, on 26 iulie 2017 - 13:18, said:
Cu siguranta a lasat fisierul deschis in acea functie. La asta m-am gandit si eu, dar nu e problema de acolo. E inchis la finalul functiei. Totusi e normal sa dea asa ceva daca el nu este deschis in nici un fel? Adica e deschis in functia mentionata de tavitu, citesc 8 bytes si il inchid. Eroarea cred ca vine de la search_handle..acolo e handel-ul pentru fiecare fisier, dar de exemplu daca aleg ca in if-ul unde se face copy sa-l inchid cand ajunge la while (FindNextFileW(search_handle, &file)); nu mai ia urmatorul fisier.. E cam aiurea.. |
#9
Posted 26 July 2017 - 18:14
FindClose(search_handle) e ok acolo unde e si nu trebuie altfel pentru ca nu mai are cum sa faca urmatoarea cautare.
Edited by neagu_laurentiu, 26 July 2017 - 18:15. |
#10
Posted 26 July 2017 - 18:27
c++ are filesystem dar probabil putine compilatoare il suporta. uite ce misto fâțâi fisiere de colo:
http://en.cppreferen...ental/fs/rename daca nu merge, atunci boost: http://www.boost.org...nce.html#rename LPCWSTR, jkshdfjkhf fâs |
|
#11
Posted 26 July 2017 - 19:30
worm94, on 26 iulie 2017 - 17:57, said:
Eroarea cred ca vine de la search_handle..acolo e handel-ul pentru fiecare fisier Problema ta se afla la MoveFile(src, dest). Daca dest ar indica spre o cale valida si un nume de fisier (acelasi sau altul) atunci ar merge brici Edited by neagu_laurentiu, 26 July 2017 - 19:31. |
#12
Posted 26 July 2017 - 19:35
Ai putea încerca să vezi dacă fișierul respectiv este întradevăr folosit de alte procese?
https://docs.microso...ownloads/handle https://blogs.techne...-a-handle-leak/ Eu nu cred că are cum să fie de la search_handle, m-aș aștepta să fie mentionat lucrul acesta în documentație, dar nu sunt suficient de familiar cu Win32 să demonstrez contrariul. În loc să procesezi fișierul în bucla unde ai nevoie ca search_handle să fie deschis ai putea să adaugi str într-un vector și să faci procesarea fișierelor găsite după ce închizi search_handle. |
#13
Posted 26 July 2017 - 19:42
Se complica daca face procesarea in alta parte, codul ala merge daca are destinatia corecta sau daca a inchis fisierul in functia readByteFromFile(). Garantat.
Pe search_handle poate sa-l inchida inainte de MoveFile si tot degeaba, nu acesta-i cu probleme (ca nu-i handle de fisier ci de cautare). Edited by neagu_laurentiu, 26 July 2017 - 19:45. |
#14
Posted 26 July 2017 - 20:11
neagu_laurentiu, on 26 iulie 2017 - 19:42, said:
Se complica daca face procesarea in alta parte, codul ala merge daca are destinatia corecta sau daca a inchis fisierul in functia readByteFromFile(). Garantat. Pe search_handle poate sa-l inchida inainte de MoveFile si tot degeaba, nu acesta-i cu probleme (ca nu-i handle de fisier ci de cautare). Tocmai asta e ciudat...in readByteFromFile() e inchis 100%(chiar la sfarsitul functiei), iar daca destinatia ar fi gresita ar trebui sa dea fail si CopyFile nu? Asa ar fi normal..adica copyFile merge, iar fara nici o modificare in ceea ce priveste path-ul nu megre cu Move. Problema sigur este de la fisiere...Asta zice si eroare 0x20, mi-a ramas functia readByteFromFile() pe, pc si nu o pot pune acum dar o las maine dimineata. Oricum nu face mare chestie, deschide fisierul citeste 8 bytes si inchide. |
#15
Posted 26 July 2017 - 20:15
Eu unul cred indiferent cat navighezi tu prin fisiere 'src' ramane neschimbat
|
|
#16
Posted 27 July 2017 - 04:29
worm94, on 26 iulie 2017 - 20:11, said:
Problema sigur este de la fisiere... Edited by neagu_laurentiu, 27 July 2017 - 04:29. |
#17
Posted 27 July 2017 - 07:09
MarianG, on 26 iulie 2017 - 20:15, said:
Eu unul cred indiferent cat navighezi tu prin fisiere 'src' ramane neschimbat [ https://preview.ibb.co/i0ghEk/Untitled.png - Pentru incarcare in pagina (embed) Click aici ] Laurentiu uite aici si ce spuneam cu functia de citire. unsigned char* parseFile::readByteFromFile(char * file, int offset, int ntOfBytesToRead) { std::ifstream stream; int index = 0; unsigned char c; unsigned char* outVector = new unsigned char[ntOfBytesToRead]; stream.open(file, std::ios_base::binary); if (!stream.bad()) { std::cout << std::hex; stream.seekg(offset); while (index <= ntOfBytesToRead - 1) { stream >> c; //std::cout << "Byte " << index << " : " << static_cast<unsigned>(c) << std::endl; outVector[index] = static_cast<unsigned>(c); index++; } } stream.close(); return outVector; } |
#18
Posted 27 July 2017 - 08:29
Esti sigur ca e vorba de acelasi fisier? Din cod nu e clar de unde vine src si daca e macar acelasi fisier pe care-l inchizi in readByteFromFile()...
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users