Kopiowanie plików pomiędzy partycjami

0

Witam wszystkich!

Mam nadzieję, że mój temat okaże się nietuzinkowy i będzie cieszył sie zainteresowaniem.

Chciałbym, aby powstał program, który będzie wstanie kopiować pliki, niekoniecznie między partycjami, ale wykorzystujący pamięc ram do tego procesu.
Wszyscy wiedzą jak wygląda kopiowanie między dwiema partycjami: jest wolne, dysk niejednokrotnie trzeszczy (co jest niepokojące i trudno określić jaki ma wpływ na sprzęt).

Nie jestem programistą, ale wiem, że napisanie takiego proga nie byłoby skomplikowane i czasochłonne dla kogoś, kto się na tym zna. Szukałem w sieci, ale nie udało mi sie znaleźć czegoś działającego na takiej zasadzie:

[Fragment pliku (np. 10 MB)] ---> [Pamięć operacyjna] ---> [miejsce docelowe na dysku twardym] itd. aż do powielenia całego pliku

Namiastką takiego programu okazał się dla mnie winrar. Opiszę po krótce jak go używałem, zgodnie z powyższym schematem.

Aby przenieść plik wielkości 300 mb z jednej partycji na drugą, przy pomocy tzw. Ramdisku o pojemności 32 mb rozpocząłem tworzenie archiwum programem winrar z opcją dzielenia plików na części (określiłem rozmiar części pliku na 30 mb). Po utworzeniu pierwszej części WinRar monitował brak miejsca na utworzenie kolejnej. Wtedy rozpocząłem wypakowywanie utworzonej przed chwilą części pliku (która znajdowała się na ramdisku) na drugą partycję, po czym zostałem poproszony o podanie ścieżki do drugiej części. Następnie usunąłem pierwszą część w celu zwolnienia miejsca na ramdisku i wznowiłem tworzenie archiwum, tworzenie drugiej jego części. W ten sposób postepowałem az do skopiowania całego pliku.

Może ktoś zna taki program albo mógłby go napisać?

0

Ja już mam program, który robi dokładnie coś takiego. W moim commanderze będącym jeszcze w fazie rozwoju kopiuje pliki poprzez bufor w pamięci w porcjach po np. 16 kB. Ale ta porcja może być dowolnej wielkości.

0

Jest taki program - Eksplorator Windows ->Prawy przycisk myszy ->Przenieś Tutaj ;-)
oj przepraszam -> Kopiuj Tutaj :-D No tak miało byc kopiowanie ...

0

A póki co to weź zainstaluj total commander i ustaw sobie duży bufor w opcjach programu. to też działa w taki sposób, jakiego oczekujesz.

0
Kowalski napisał(a)

A póki co to weź zainstaluj total commander i ustaw sobie duży bufor w opcjach programu. to też działa w taki sposób, jakiego oczekujesz.

gdzieś na http://totalcmd.pl jest również odpowiedni plugin do totalcmd</url>

0

A tak na poważnie , to można postawić pytanie jak zmusić program aby
przydzielił pamięć na bufory przeznaczone na kopiowanie w RAM a nie np. w pliku.
Przydzilenie przez program pamięci na bufor o dużych rozmiarach kończy się
na pamięci wirtualnej na dysku ,niestety ..

0
dzejo napisał(a)

Przydzilenie przez program pamięci na bufor o dużych rozmiarach kończy się
na pamięci wirtualnej na dysku ,niestety ..

No to juz kwestia systemu i jego rozwiazania pamieci wirtualnej. Program nie ma tu nic do rzeczy - on sadzi, ze wszystko dzieje sie w RAMie.

pozdrawiam
johny

0

No właśnie: jak go zmusić? Chyba się nie da, bo wg mnie nie ma jeszcze takiego programu. Myslałem raczej o czymś takim, gdzie będzie można umieścić bufor na dysu w eksploratorze windows, a tym dyskiem będzie właśnie ramdisk, lub o programie, który wykorzystuje wyłącznie pamięć ram, ale jeśli program kożysta z pamięci ram w zwykły sposób, to bardzo prawdopodobne, że jeśli bufor będzie odpowiednio duży, to kopiowanie "niby przez RAM" będzie odbywało się przy udziale pliku wymiany, który znajduje się na dysku twardym (tak, jak napisali dżejo i johny bravo).

0

Oj John ja Cie podziwiać i szanowac ale ;-) jak masz w kompie 128 MB RAMU
,a program zeżre 4 GB to potrzebna pamięć dla programu jest symulowana w pliku wymiany.
W Win32 program może zająć cały dysk instrukcją new czy tam malloc , rezerwując
pamięc dla siebie. ;-) , będzie miał przydzieloną pamięć ale ramu całego nie zajmie
nie da rady , wiadomo dla czego :-/
Zastanawiam się tylko czy można np. Na 100% przydzielić jakąś funkcją API pamięć
w RAMIE ew. dostać komunikat od funkcji że jest to nie możliwe .

0

Dzejo, z tego, co piszesz wnioskuję, że to mogłoby być trudne. Nie łatwiej więc zrobić program wykorzystujący Ramdisk (który na 100 korzysta z ramu i tylko z ramu)?

0

No czlowieku jak masz 512 MB w samym kompie to nie zrobisz na życzenie 512 MB Ram-Disk.
Pytanie o przydział pamięci przez API , opieram na tym że istnieją funkcje przydzielające
pamięć w pliku wymiany na żądanie ( ograniczone rozmiarem dysku ) , więc może są i dla RAM ..? [???]
Własciwie to przy pisaniu aplikacji nikt się nad tym nie zastanawia.
Jak napisał John Program przydziela tyle pamieci ile mu potrzeba , reszta to sprawa systemu
i nie mamy na to wpływu ..
Teraz pytanie ..A może programy typu RAM-Dysk korzystają z pliku wymiany , ?
Jeśli nie to znaczy że istnieje sposób przydziału w RAM ,,,
Jak powiedział Krecik POMOC!! ,POMOCC!!
Życie uczy pokory , początkowo pierwsze pytanie w wątku wydało mi się głupie... [glowa]

0
dzejo napisał(a)

Oj John ja Cie podziwiać i szanowac ale ;-) jak masz w kompie 128 MB RAMU
,a program zeżre 4 GB to potrzebna pamięć dla programu jest symulowana w pliku wymiany.
W Win32 program może zająć cały dysk instrukcją new czy tam malloc , rezerwując
pamięc dla siebie. ;-) , będzie miał przydzieloną pamięć ale ramu całego nie zajmie
nie da rady , wiadomo dla czego :-/
Zastanawiam się tylko czy można np. Na 100% przydzielić jakąś funkcją API pamięć
w RAMIE ew. dostać komunikat od funkcji że jest to nie możliwe .

O tym wlasnie pisalem - zdaje sie nie zrozumiales. Program rezerwujac cokolwiek sadzi, ze rezerwuje w RAMie. A czy to fizycznie RAM czy pamiec wirtualna to zalezy tylko i chyba wylacznie od systemu. Nie sadze, zeby bylo mozliwe wymagac od systemu, zeby trzymal w RAMie.

Jedynym sensownym sposobem jest mieszac caly czas w pamiecy. System powinien wtedy sadzic, ze pamiec jest wykorzystywana, wiec bedzie sklonny ja zostawic w RAMie, a inne mniej wykorzystujace ja aplikacje przerzucic do swapa. Nie gwarantuje to of coz zostawienia w RAMie, ale powinno w wiekszosci zadzialac. No chyba, ze ktos ma 128MB jak pisales i chce miec 4GB RAMDiska :P

pozdrawiam
johny

0

to zalezy tylko i chyba wylacznie od systemu

A bo tak pisze -nieskładnie- i moze staje się przykry dla środowiska , zrozumiałem. Tylko własnie ta odpowiedz...mozna wymusić w 100% bufor w RAM czy nie ? np. w Windows przynajmniej na 1-go bajta :-)

0
dzejo napisał(a)

to zalezy tylko i chyba wylacznie od systemu

A bo tak pisze -nieskładnie- i moze staje się przykry dla środowiska , zrozumiałem. Tylko własnie ta odpowiedz...mozna wymusić w 100% bufor w RAM czy nie ? np. w Windows przynajmniej na 1-go bajta :-)

Jak dla mnie calkiem skladnie :P Wedlug mnie wymusic nie mozna. Mozna co najwyzej starac sie 'przekonywac'. Gdyby dalo sie wymusic to nie bylby to za bardzo dobry system - Win idealny nie jest, ale kiepski tez nie. Moglbys wtedy np. napisac wirka, ktory zajmowalby caly, badz wiekszosc RAMu - dopiero komp by wolno lazil...

pozdrawiam
johny

0

No tak właśnie przeglądam "Programowanie aplikacji dla Microsoft Windows"
Jeffrey Richter-a , jest sporo informacji na temat badania pamięci procesu
ale temat RAM jest na n-planie ,aplikacja używa po prostu pamięci wirtualnej ,
można żądać przydziału adresów w tym obszarze ale nic więcej.
Jednak coś mi się tu nie podoba , mam zamiar jeszcze zapoznac sie z tzw. Native API
może jesze tam cos jest .(Funkcjach działających na poziomie jądra systemu ) ...
czy ma to sens nie wiem .... [???] chyba wpakowałem się w jakies bagno..

0

To google jest takie nietuzinkowe? Uzyj VirtualLock(wskaznik, rozmiar); - funkcja mowi systemowi, ze ta pamiec ma nie przenosic do swapa (dziala tylko w NT).

0

A win98 i XP [???]

// xp ? ty masz xp , a twoj xp przedstawia sie tak : Windows NT 5.1, btw win 2000 to NT 5.0, a 2003 to (chyba) NT 5.2 [mf]

0

// xp ? ty masz xp , a twoj xp przedstawia sie tak : Windows NT 5.1, btw win 2000 to NT 5.0, a 2003 to (chyba) NT 5.2 [mf] :-/

Sprawdzałem wywołanie finkcji VirtualLock i VirtualUnlock .

VirtualLock zwraca 0 .
Sadzę że podałem nieodpowiedni wskażnik.
Własciwie funkcje do rezerwacji pamięci są trochę pokręcone, może jako wskażnik do funkcji
VirtualLock trzeba przekazać wskaznik uzyskany z wywołania innej funkcji ...

BOOL VirtualLock(

    LPVOID lpAddress,	// address of first byte of range to lock  
    DWORD dwSize 	// number of bytes in range to lock 
   );	
 

Parameters

lpAddress

Points to the base address of the region of pages to be locked. 

dwSize

Specifies the size, in bytes, of the region to be locked. The region of affected pages includes all pages that contain one or more bytes in the range from the lpAddress parameter to (
lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes both pages to be locked. 

Zapowiadają się kombinacje....

Czy ktoś wie jak programowo utworzyć RAM-Dysk.. [???]

0

Dzięki za linki. :-).Wreszcie coś konkretnego..

---------------------------------------Dzięki za linki. :-).Wreszcie coś konkretnego..
Trochę to jednak dziwne ,trzeba chyba napisac aplikację i sprawdzić..
Mi się wydaje że nie ma gwarancji co to tego że zablokowana strona zostanie zawsze
w pamięci RAM.
Główną rolę jednak pełni tutaj VirtualAlloc a ona zawsze rezerwuje stronę w pliku wymiany,
dopiero zapis do strony przenosi ją do RAM.
Bo np w "Programowanie aplikacji dla Microsoft Windows" Jeffrey Richter
Strone można zachowac w pamięci tak:

PINT data = (PINT) VirtualAlloc(NULL ,RozmiarStrony,MEM_RESERVE | .....,PAGE_READWRITE);

data[0] = 100 ; // zapis w celu przeniesienai do pamięci

VirtualAlloc((pvoid)data ,RozmiarStrony,MEM_RESET,PAGE_READWRITE);

Czyli przez MEM_RESET , w dalszym ciągu nie mamy jednak dostępu ,ponieważ tak
zablokowana strona jest wtedy łasnością systemu i nie możemy jej użyć 'ręcznie'
chociaż pozostaje w RAM (do ew. wykorzystania przez system dla programu) .
Facet natomiast pisze że w Win 2000 jest specjalny mechanizm
' Address Windowing Extensions' (AWE) <- Maryja ;-)
z Funkcją AllocateUserPhysicalPages , umożliwia alokowanie pamięci która nigdy
nie bedzie przerzucana na dysk..
Natomiast nie wspomina ani słowem o VirtualLock [???]

I co dalej ...?

0

W tym poście nie będę kontynuował aktualnej dyskusji, ale odpowiem prosto z mostu na postawione pytanie:

Można spróbować otworzyć plik przez okienko tekstowe (oczywiście ukryte ;-) ), część (np. niewiem 1000 (1024) znaki (zaraz, muszę przeliczyć ile to wyjdzie pamięci)) skopiować do zmiennej (=do RAM'u), a następnie zapisać to jako nowy plik na innej partycji.
Całość w pętelkę, dopisuemy kolejne fragmenty pliku aż do skonczenia znaków w oknie tekstowym.
Ładnie oprawiamy w atrybuty pliku i gotowe.

Jest tylko jedna sprawa, na którą nie znam odpowiedzi: Obawiam się, że otworzenie pliku w TextBox'ie już przymuli pamięć (nie wiem gdzie są przechowywane wartości właściwości obiektów, powiedzcie!), co niweczy wszelkie starania.

Aż na takim poziomie w C++ jeszcze nie jestem, wiem, że w VB technicznie można by to zrobić, teoretycznie powinno się udać, a w praktyce nie znamy praktycznych wyników.

0

Bez sensu (pamieciozerne) i do tego nie gwarantuje w ogole sukcesu. Wystarczy zwykla zmienna zamiast okienka tekstowego (a jaka oszczednosc pamieci).
Po drugie

skopiować do zmiennej (=do RAM'u)

to bzdura, a z powodow wymienionych powyzej.

pozdrawiam
johny

0

Grunt to pewność siebie...

Bobinho:

W tym poście nie będę kontynuował aktualnej dyskusji, ale odpowiem prosto z mostu na postawione pytanie:

Można spróbować otworzyć plik przez okienko tekstowe (oczywiście ukryte ), część (np. niewiem- 1000 (1024) znaki

No pięknie.Popadłem w depresję ;-(
Z tego wszystkiego zabrałem się za podane linki (podane przez Flabra ) i kompilator dokonałem przeróbek i :

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
  LPVOID lpvAddr;               // address of the test memory
  DWORD dwPageSize;             // amount of memory to allocate.
  BOOL bLocked = 0;                 // address of the guarded memory
  SYSTEM_INFO sSysInfo;         // useful information about the system
  GetSystemInfo(&sSysInfo);     // initialize the structure

  DWORD countPage = 4  ;

  DWORD MinimumWorkingSetSize ;
  DWORD MaximumWorkingSetSize ;

  HANDLE h_process = GetCurrentProcess();

if(0 == GetProcessWorkingSetSize( h_process ,&MinimumWorkingSetSize,&MaximumWorkingSetSize))
 {
   fprintf(stderr, "Niepowodzenie 'GetProcessWorkingSetSize' " );

 }else{

        fprintf(stderr, "MinimumWorkingSize = %lu  ,MaximumWorkingSize = %lu \n",
                MinimumWorkingSetSize ,MaximumWorkingSetSize  );
fprintf(stderr,"WorkingSize = %lu kB \n",(MaximumWorkingSetSize - MinimumWorkingSetSize)/1024);
      }

  printf("This computer has page size %d.\n", sSysInfo.dwPageSize);

  dwPageSize = sSysInfo.dwPageSize;

  // Try to allocate the memory.

  lpvAddr = VirtualAlloc(NULL, dwPageSize*4,
                         MEM_RESERVE | MEM_COMMIT,
                         PAGE_READWRITE );

  if(lpvAddr == NULL) {
    printf("VirtualAlloc failed. Error: %ld\n",
           GetLastError());
    return 1;

  } else {
    fprintf(stderr, "Przydzielono %lu bajtow ( %lu kB)  od adresu %lp\n",
            dwPageSize*countPage,dwPageSize*countPage / 1024 , lpvAddr);
  }


 ((BYTE*)lpvAddr)[0] = 1 ;
         sprintf((BYTE*)lpvAddr," Coś tam ,coś tam "); // zapis do pamięci


 fprintf(stderr, "Program zatrzymany PRZED wywolaniem Funkcji VirtualLock - nacisnij ENTER\n");
 getchar();

  ((BYTE*)lpvAddr)[0] = 1 ;

 bLocked = VirtualLock(lpvAddr, dwPageSize*countPage);

  if (!bLocked) {
    fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n",
            lpvAddr, GetLastError());
    fprintf(stderr, "Dzialanie funkcji VirtualLock zakoczylo sie niepowodzeniem !\n");
  } else {
    fprintf(stderr, "Zablokowanie osiagnieto od adresu %lp Funkcja VirtualLock\n", lpvAddr);
  }

  ((BYTE*)lpvAddr)[0] = 1 ;
         sprintf((BYTE*)lpvAddr," Coś tam ,coś tam "); // zapis do pamięci

 fprintf(stderr, "Program zatrzymany przed operacja zwalniania pamieci - nacisnij ENTER\n");
 getchar();
 if(bLocked)
 {
     if(0 == VirtualUnlock(lpvAddr,dwPageSize*countPage))
     {
     fprintf(stderr,"Blad funkcji 'VirtualUnlock '. \n");

     }else{
  fprintf(stderr, "Program zatrzymany po wywolaniu funkcji VirtualUnlock - nacisnij ENTER\n");
  getchar();
          }
 }



     if(0 == VirtualFree(lpvAddr,dwPageSize*countPage,MEM_DECOMMIT))
     {
         fprintf(stderr,"Blad przy zwalnianiu pamięci!");
     }


 fprintf(stderr, "Program zatrzymany po zwolnieniu pamieci - nacisnij ENTER\n");
 getchar();
  return 0;
}

Zachowanie programu można śledzić w Menadzerze zadań na pamięcio-żerność.

Następnie wykomentować linijkę w ten sposób :-D :
I sprawdzić program bez wywołania 'VirtualLock '.

 //// bLocked = VirtualLock(lpvAddr, dwPageSize*countPage);

Ponownie prześledzić ,wnioski mogą być ciekawe.
Chyba jednak można .. lecz nie jestem do końca pewien.
Myślę że można w ten sposób przydzielić nie więcej niż 120kB pamięci w optymistycznej wersji ,
umieszczonej na stałe w RAM dla procesu.
ok 30 stron po 4096 bajtow .
Trzeba by sprawdzić przy jakiej ilości stron VirtualLock sie wykłada i już.

Ostatecznie zostaje jeszcze RAM *a = new RAM[1024] ;

Ale wtym stanie to dla mnie za wiele ..

....
Jest tylko jedna sprawa, na którą nie znam odpowiedzi: Obawiam się, że otworzenie pliku w TextBox'ie już przymuli pamięć (nie wiem gdzie są przechowywane wartości właściwości obiektów, powiedzcie!), co niweczy wszelkie starania......

;-(
...Rozpoczynanie nauki C++ od Buildera i gotowych komponentów prowadzi do katastrofy, w pewnych przypadkach ....


Jak ktoś nie ma lepszych zajęć (niż babranie się w pamięci) to proszę o uruchomienie tego kodu i podanie wniosków do publicznej wiadomości...(nie na temat kodu bo to tylko test , lecz zachowania VirtualLock) .

1 użytkowników online, w tym zalogowanych: 0, gości: 1