C# risparmiare spazio in un progetto

Stato
Discussione chiusa ad ulteriori risposte.

Flynns82

Utente Electrum
14 Gennaio 2013
265
42
25
151
ciao a tutti, sto facendo un programma che contiene alcuni video, audio e tantissime immagini, pesa davvero tanto, volevo chiedervi se come ad esempio per i giochi, potevo racchiudere i file audio e video dentro pack compressi per risparmiare spazio, e ovviamente, se si può fare, potete dirmi anche come posso farlo e come dire al programma di andare a prendere i file dentro i pack compressi? grazie mille!
 
Tu includi i video all'interno delle resource? Solitamente non si fa mai per file grandi.
Quando l'exe viene caricato in memoria vengono caricate anche le resource e quindi saturi la ram dell'utente.

Se invece usi i video esternamente alle resource puoi in fase di distribuzione comprimere i video con un classico zip ad esempio e decomprimerli in fase di installazione per poi usarli singolarmente.
 
  • Mi piace
Reazioni: Flynns82
ecco questo intendevo, io mo li ho in resource e voglio tirarli fuori, ma volevo fare che tutti i file non li mettevo in uno zip(facilmente accessibile) volevo criptarli dentro dei file compressi che il mio programma deve essere in grado di andare a leggere, come posso fare?
 
Di metodi già prefatti sinceramente non ne conosco. Se intendi rendere questi video inaccessibili agli utenti io farei una cosa del tipo:
- Crea un file binario (con BinaryWriter ad esempio)
- Creati un indice in testa al file per ogni video ad esempio "file1.avi,0,1245" dove 0 sta per l'offset di inizio all'interno del file che creerai e 1245 la lunghezza di quanti byte formano questo avi di esempio. (Puoi anche usare due file se ti fa più comodo, uno di video e l'altro di indice)
- Leggi ogni video in binario in un array di byte
- Cripta ogni array (AES o RSA)
- Accoda in binario tutti gli array criptati dei file video uno dopo l'altro

Voilà, avrai un file pack di tutti i video. Veloce da trasferire e se cripti con AES non ne risenti neanche in velocità di decrypt.

Prova, se vuoi una mano chiedi
 
diciamo che non sono ancora a quei livelli haha, ho capito ben poco, piu che altro, come farlo, sapresti dirmi cosa cercare su internet per trovare qualcosa? preferibilmente script gia fatti, cosi me li guardo un po per capire come funziona
 
Per leggere i bytes di un singolo file video:
Codice:
byte[]  fileVideoUno = File.ReadAllBytes(path_del_file_video);

Ti ricavi la lunghezza del file video:
Codice:
int lengthUno = fileVideoUno.Length;

Una volta ottenuta una cosa del genere in fileVideoUno hai il tuo video in un array di byte e nella variabile lengthUno quanti byte è lungo il tuo file video.

Facciamo finta che la lenght del primo video sia 1056 bytes.
Quindi lengthUno = 1056;

Processiamo un secondo video:
Codice:
byte[]  fileVideoDue = File.ReadAllBytes(path_del_file_video2);
int lengthDue = fileVideoUno.Length;

//Ad esempio il secondo video è lungo 1497 byte
lengthDue = 1497;

Uniamo i due array dei video letti in un unico array:
Codice:
byte[] fileVideoUniti =newbyte[lengthUno + lengthDue];
fileVideoUno.CopyTo(fileVideoUniti,0);
fileVideoDue.CopyTo(fileVideoUniti, lengthUno);

Scriviamo il risultato dei file accodati in un unico file:
Codice:
File.WriteAllBytes("C:\\FileRisultato.pack",fileVideoUniti);

Quindi ricapitolando sappiamo che il primo video è lungo 1056 bytes mentre il secondo 1497.
Puoi creare un semplice file di testo che userai per estrarre dal "pack" il file video che ti serve:
FileVideo1,0,1056 // 0 = Offset di partenza - 1056 = Lunghezza in byte
FileVideo2,1057,1497 // 1057 = Offset di partenza(Il byte subito dopo la lunghezza del primo file) - 1497 = Lunghezza in byte
e cosi via....


Per quanto riguarda invece la criptatura con AES puoi (prima di scrivere il file FileRisultato.pack) processare ogni singolo byte array di ogni singolo video e criptarlo con la chiave AES che ti definisci. Ho trovato un codice di esempio (in inglese) che puoi trovare qua:

http://www.obviex.com/samples/encryption.aspx

Spero che questo esempio ti sia di aiuto ;)
 
allora, ho provato e sono arrivato a quando mi crea il file, credo di aver capito come funziona piu o meno(grazie!), mi servono 2 cosette veloci, due chiarimenti, 1) il file .pack che mi ha creato, è una specie di file che contiene le immagini oppure un file con scritto dentro il binario di ogni file? 2) se nel .pack ci sono i file e non il binario, come faccio a dirgli ad esempio che un video da eseguire oppure un'immagine da mettere come sfondo si trova la dentro?

non ho capito il passaggio:
"Puoi creare un semplice file di testo che userai per estrarre dal "pack" il file video che ti serve:
FileVideo1,0,1056 // 0 = Offset di partenza - 1056 = Lunghezza in byte
FileVideo2,1057,1497 // 1057 = Offset di partenza(Il byte subito dopo la lunghezza del primo file) - 1497 = Lunghezza in byte
e cosi via..."
scusa se son complicato ma sono ancora alle prime armi
 
1) Il file pack che ti ha creato è una concatenazione di tutti i file che hai accodato uno dopo l'altro cioè come dici tu è un file con scritto dentro il binario di ogni file.

2) Per processare poi il file che ti serve supponiamo che ti serva un immagine ti estrai dal file pack il contenuto in bytes dell'immagine (a partire dall'offset di partenza e numero di byte che precedentemente ti sei creato) e lo assegni ad un array di bytes e poi:

Codice:
public Image byteArrayToImage(byte[] byteArrayIn)
{
    //Questo metodo ti restituisce un oggetto Image che poi puoi visualizzare
    try
    {
        MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
        ms.Write(byteArrayIn, 0, byteArrayIn.Length);
        Image returnImage = Image.FromStream(ms,true);
    }
    catch { }
    return returnImage;
}

Cosa simile per i video. Dipende tutto da come e dove poi dovrai visualizzare il video.
 
bho, mi spiace romperti cosi tanto hahah non riesco a capire il funzionamento, fino a leggere i byte e creare il file si, poi bho, vuoto, ma i file video e immagini, poi si inseriranno dentro file tipo il pack di prima oppure rimangono liberi? poi, lo "0" che c'è tra byteArrayIn e byteAarrayIn.Length sarebbe la posizione da dove deve iniziare a leggere il codice binario?
 
Mi rendo conto che non hai le basi per procedere in quello che vuoi fare perchè almeno a livello concettuale dovresti aver capito come procedere che poi tu non sappia programmare bene a quello si può ovviare...
Provo ad instradarti verso la giusta via...

Dici di esser arrivato a scrivere il file .pack.
Che file hai letto con File.ReadAllBytes(path); ? Il file pack non è nient'altro che la somma dei file che hai letto con File.ReadAllBytes se hai seguito quello che ti ho detto nei precedenti messaggi.

Non devo spiegarti il codice pezzo per pezzo, cosi non imparerai mai. Mi chiedi cos'è lo 0?
Lo 0 dove viene passato? Sull'oggetto ms.
ms
cos'è? Un MemoryStream.
MemoryStream cosa accetta come parametri?
Codice:
https://msdn.microsoft.com/it-it/library/system.io.memorystream%28v=vs.110%29.aspx

Tu in che caso sei di MemoryStream? 3 parametri gli vengono passati. Un array di byte e due interi.
Quindi? Quindi sei in questo caso: MemoryStream(Byte[], Int32, Int32)
Come funziona quindi?
Codice:
https://msdn.microsoft.com/it-it/library/63z365ty(v=vs.110).aspx

Quindi cos'è sto benedetto 0? è il secondo parametro quindi (nel link sopra) index

Cos'è index? Indice in buffer in corrispondenza del quale inizia il flusso.

Devi iniziare a pensare cosi se davvero vuoi imparare, l'unico modo è documentarsi, soprattutto agli inizi.
 
ho capito di star correndo un po troppo, mi salvo tutta questa discussione e quando sarà piu "esperto" proverò a fare qualcosa, grazie mille per tutto :)
 
Stato
Discussione chiusa ad ulteriori risposte.