Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Presbiopia - la 43 ani ?

Termen transcriere autovehicul

Cazare Timisoara pe 4-5 zile

Primele zile ale internetului per...
 Ditra 25

Casti USB-C ptr A-54

Aplicatie medicala / asistent med...

De ce vor atația politicieni...
 ERR_ADDRESS_UNREACHABLE

Legea 18/1968 Se mai aplica?

Digi conectare 2 routere prin fir

Succesiune notar versus instanta ...
 Montaj aer conditionat in balcon ...

Cont curent mulți valuta far...

Sugestii plan casa

Experiente cu firme care cumpara ...
 

Stergerea fisierelor copiate in Windows/C++

- - - - -
  • Please log in to reply
20 replies to this topic

#1
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015
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, B)) {
	 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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
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
modoran

modoran

    Senior Member

  • Grup: Senior Members
  • Posts: 8,379
  • Înscris: 08.02.2011
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
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

 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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
Trebuie sa citesti acel fisier? Daca da, inchide-l macar si pe urma il muti cu MoveFile, nu trebuie CreateFile in poveste.

#6
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
Cu siguranta a lasat fisierul deschis in acea functie.

Edited by neagu_laurentiu, 26 July 2017 - 13:22.


#8
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

 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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
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
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003

 worm94, on 26 iulie 2017 - 17:57, said:

Eroarea cred ca vine de la search_handle..acolo e handel-ul pentru fiecare fisier
Nu vine de acolo. Acel handle e pt. cautare, nu-i de fisier asa ca n-are legatura.
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 Posted Image

Edited by neagu_laurentiu, 26 July 2017 - 19:31.


#12
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
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
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

 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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,428
  • Înscris: 10.08.2005
Eu unul cred indiferent cat navighezi tu prin fisiere 'src' ramane neschimbat

#16
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003

 worm94, on 26 iulie 2017 - 20:11, said:

Problema sigur este de la fisiere...
Am si rulat codul tau ca m-a facut curios in raport cu teoria din cap si e asa cum ziceam, daca sursa si destinatia au valori valide iar in functia de citire e inchis fisierul, totul merge cum trebuie si la MoveFile. Asa ca vezi in acele variabie ce ai, din codul postat nu se vede.

Edited by neagu_laurentiu, 27 July 2017 - 04:29.


#17
worm94

worm94

    Member

  • Grup: Members
  • Posts: 266
  • Înscris: 02.01.2015

 MarianG, on 26 iulie 2017 - 20:15, said:

Eu unul cred indiferent cat navighezi tu prin fisiere 'src' ramane neschimbat
Nu ramane neschimbat si chiar daca ar fi ramas nu ar fi trebuit sa dea eroarea aia.functioneaza ok numai ca nu merge sa fac move sau delete. Uite si un output pe un folder mic..
[ 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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate