Aquest llibre té més acció que els anteriors, la cosa ja es comença a moure. Ja era hora, que és el llibre número 12. Principalment tracta dos personatges, en Rand i la Egwene.
[Spoilers] En Rand, que ha perdut una mà, manté a la Forsaken Semirhage presonera. Però una Black Ajah l'allibera i amb una banda de dominació captura en Rand. Quan està a punt d'obligar a en Rand a matar la Min Farsaw aquest fa servir el True Power que no està restringit per la dominació i s'allibera. Mata a la Semirhage amb Balefire destruint-la definitivament. Envia a la Cadsuane a l'exili ja que no ha vigilat bé la banda de dominació.
També es reuneix amb la Tuon però no la convenç d'aliar-se amb ell. En tot aquest procés intenta endurir-se i no sentir emocions. A més a més la Tuon es declara emperadriu i es dirà Fortuona i planeja un atac a la Torre Blanca de les Aes Sedai. En Rand aconsegueix l'ubicació d'un altra Forsaken, la Graendal, i extermina el lloc sencer amb Balefire.
La Egwene segueix a la White Tower intentant minar l'autoritat de la Elaida. Però al final la posen a la presó, la Elaida castiga a la responsable de trencar la voluntad de la Egwene, la Silviana per no haver-ho fet. Quan torna a la seva habitació troba la Verin que li confessa que és part del Black Ajah. Aquesta confessió la pot fer perquè la promesa que va fer al Senyor Fosc va ser fins l'hora de la meva mort. I ha begut un té enverinat que la matarà en un hora... llavors pot parlar tranquil·lament durant una hora. És del Brown Ajah dedicada a l'estudi de coses i ella s'ha dedicat a l'estudi del Black Ajah. Ha recopilat el nom de les Aes Sedai membres, com es comuniquen i futurs moviments, i li dóna a la Egwene, just abans de morir.
Aleshores ataquen els Seanchan. La Egwene aconsegueix escapar i organitza la resistència. Els seus amics corren a rescatar-la, però ella no vol ser rescatada, igualment se l'emporten al campament de les Aes Sedai rebels. Allí fa neteja del Black Ajah i es prepara per atacar la Torre, però al final no cal perquè les Aes Sedai de la Torre l'han escollit a ella Amirlin. També fa neteja a la Torre i anomena a la Silviana com a Keeper. Aconsegueix unificar la Torre.
La Nynaeve, per ordre de la Cadsuane, porta al Tam, el pare d'en Rand, de visita. En Rand s'enfada perque es sent manipulat per la Cadsuane i una mica més i mata al seu pare. Així que marxa enfadat i arriba a Ebou Dar, disposat a eliminar la ciutat sota control dels Seanchan. I s'adona que la gent allí viu bé, que els Seanchan no són uns opressors i que han posat ordre a les coses. Marxa enfadat i frustrat a les muntanyes Dragonmount, i allí es disposa a liquidar el món sencer per evitar el sofriment que vindrà amb el DarkOne i cansat de repetir sempre el mateix. Aleshores la veu de Lewis Therin li diu que si la Roda del Temps gira i fem els mateixos errors de fet també ens dóna oportunitats de fer les coses diferents. Aleshores decideix intentar-ho i deixa d'estar enfadat i torna a riure. [/Spoilers]
Com que el llibre té més moviment que els anteriors, el ritme és més ràpid, potser el canvi d'autor li ha sentat bé, m'ha agradat més que els anteriors. L'autor de la sèrie, Robert Jordan, va morir sense acabar-la. Però com ho veia venir va explicar com volia que anessin les coses. Aleshores la seva família li va encarregar al Brandon Sanderson acabar-la. És una pena que per arribar aquí es tinguin que llegir 11 llibre lents. Encara que per mi ja hem va bé, així hem frena una mica el ritme de lectura :D
Aquest estiu no he tingut més remei que anar a veure alguna peli infantil. I ha tocat aquesta... errr cosa. El cert és que vam anar a l'agost i ara recordo que tinc que posar el post. Els meus fills ni recorden que van anar al cine, així de remarcable és. Ja es sap que Cars (nens) o Frozen (nenes) van pegar fort i he patit la "car-itis" i la "frozenitis"... no és el cas. De fet l'argument el començo a tenir borrós en la memòria, algo d'un nen petit que es fa amic del gos que ha de superar alguna por seva, i el conill lluitant contra un ensinistrador de circ que té un tigre atemorit. Algo així. Total, bona qualitat, argument meh, pels nens ja va bé per matar un diumenge amb pluja. Més enllà d'això no cal buscar-li cap altra utilitat.
El que té l'estiu i els nens de vacances és que busques llocs frescos on desconnectar, i el cine és un bon lloc entre setmana. Així que millor que una peli de "tortas como panes"... És com el Bud Spencer i el Terence Hill però en modern. Segueix el típic guió de l'estil "Buddy film" on les dinàmiques entre els co-protagonistes fan la festa. [Spoilers] Afegim a la festa el tòpic de germà protector ja que el Hobb es vol liar amb la germana dels Shaw i ja està muntat el sidral. La peli són insults constants entre els dos, encara que s'estimen molt, el dolent dolentot també reparteix, però al final entre els dos aconsegueixen liquidar-lo. I com bona preqüela del F&F 9 ja presenta la següent. Introdueixen dos personatges nous, l'agent Dinkley (Kevin Hart) i un agent de la CIA que els passa la feina (Ryan Reynolds)[/Spoilers]
Així que si busquem una peli d'estiu, on no cal pensar, les lleis de la física, gravetat, biologia, etc... són constantment incomplertes, etc... Aquesta és la peli. Per coses profundes no. Als nens els va agradar, i si a ells els agrada a mi també. Recomanada!
Segueixo llegint WoT (Wheel of Time), aquest cop el llibre número 11. Segueix en la línia dels anteriors, on els personatges van fent lentament cap al lloc on es suposa que van. Realment són llibres pausats, que ja hem va bé perque un cop ubicats els personatges van fent. Encara que també hi ha escenes d'acció. El que recomano és a vegades llegir la Wikipedia del WoT quan no es sap ubicar un personatge, perque també ho té, que a vegades no queda clar qui és qui. Això hem molesta, que l'escriptor a vegades no deixa clares les coses, però després de 11 llibres ja estic acostumat i amb aquesta Wiki cap problema.
[Spoilers] La Elayne acaba guanyant el tro de Andor, encara que està embarassada del Rand. També liquida a les Aes Sedai dolentes, del Black Ajah, de la capital Caemlyn. Egwene, capturada per la Torre Blanca, torna a ser aprenent "novice", i encara que la castiguen molt no es rendeix i segueix minant el poder de la Elaide des de la pròpia torre. Alguns capítols de la Egwene es llegeixen molt ràpid i bé
En Rand escapa una trampa de Semirhage, una Forsaken torturadora. Encara que per poc, perd una mà. El Mat i la Tuon segueixen en el seu estira i afluixa, però s'acaben casant quan en Mat l'allibera perque vagi a governar als Seanchan. També en Mat es planteja anar a rescatar a la Moraine que ha desaparegut fa un munt de llibres i tothom creu morta, però en realitat està en mans dels Aelfinn. Tuon torna a Ebou Dar on s'entera que hi ha una guerra civil entre els Seanchan i que han matat a tota la familia real, sent ella la nova emperadriu.
En Perrin derrota finalment als Aiel Shaido a Malden amb l'ajuda de uns Seanchan i rescata a la seva dóna Faile (segrestada en el llibre anterior). Durant tot el llibre es descriuen fets conforme la batalla final s'acosta. [/Spoilers]
El llibre es deixa llegir força bé, ha millorat respecte l'anterior. Tot i que té trossos que es podrien escurçar. Els trossos més divertits són els del Mat i la Tuon i la Egwene a la torre. La resta, pse-pse. Però va, vinga, un recomanat petitet.
Hem visitat aquesta ciutat de França. Abans d'anar-hi vam investigar que tal és etc... I vam veure que potser tenia peatges per entrar, que tenia pàrquings a les afores i han fet una targeta "Nantes Pass" que serveix per pagar aquests pàrquings, transport públic inclòs i museus inclosos. Fantàstic! I pots comprar la targeta a càmpings del voltant o a l'oficina de turisme.
Yummi? Doncs no yummi. Una M. (majúscula). Per que clar, penses, el pàrquing ok, entro al pàrquing i pago al sortir que ja tindré la "Nantes Pass", però... i el transport públic per anar des del pàrquing de les afores fins a l'oficina de turisme? Som 4... Aleshores vam buscar càmpings de les afores per veure si la tenien. Doncs no. Vam visitar 2 càmpings i res. (En un d'ells celebraven el HellFest, un concert heavy molt gran, a Clisson, i nosaltres allí). Resumint vam perdre una hora, que una hora útil amb nens es nota... Després tot el dia correns.
Al final, com anàvem tard vam entrar a Nantes amb cotxe, al rovell de l'ou i vam aparcar al pàrquing del costat de l'estació. Acostumat al preu dels pàrquings de BCN el vam trobar barat. Ni rastre dels peatges per entrar. Vam visitar el Jardin des Plantes, molt maco, recomanat, i vam tirar cap al castell dels ducs de Bretanya. Al costat hi ha l'oficina de turisme. No expliquen res que no estigui a la seva web, però vam comprar la "Nantes Pass" pels museus i l'elefant.
Al ritme infantil que anàvem vam fer el castell, que dins hi ha el museu d'història de la ciutat, amb unes maquetes espectaculars i molt xules, recomanat. El tobogan de la muralla no es pot fer servir amb pantalons curts perque crema (el sol l'escalfa), ooooh. Vam dinar al centre i després vam agafar el cotxe per fer un petit trajecte fins al pàrquing de l'Ile des Machines. Allí l'elefant estava tot ple i no vam poder pujar (WTF! estava inclòs al Pass!). Reflexionant, de fet millor, per estar tancat dins l'elefant que va mooooolt lent, millor estar al voltant, el veus igual i marxes quan vols. Sí vam poder pujar a Carrousel des mondes marins.
Total, Nantes Pass 24 una M. ni pàrquing ni transport públic, 1 museu, 1 atracció, (l'altra plena i de fet millor). No va sortir gens a compte, l'oficina de Info Turistique res que no estigui a la web, pèrdua de temps. I amb peques tampoc es pot fer un ritme gaire ràpid. La ciutat bé, castell bé, elefant bé (no cal pujar, només veure'l), i carrousel bé. Ens vam deixar per visitar altres museus i un vaixell de guerra que tenien per allí (inclòs al pass, però no va donar temps). A toro passat si hagués de fer la visita seria diferent... però com no sabíem es va fer el que es va poder.
Que dir d'aquesta sèrie que no s'hagi dit en tots els internets. A mi m'ha semblat un "corre-corre". Amb això vull dir que en temporades anteriors hi havia capítols que no passava gran cosa i si no els veies tampoc et perdies res. En canvi en aquesta volen tancar els fils argumentals i apa.
Respecte al guió m'ha semblat que han liquidat temes massa ràpid. Sempre he considerat que aquesta sèrie era una de zombies a l'edat mitja. I res, tema zombies pim-pam, i un pim-pam si més no discutible. Un tema que m'ha mosquejat força és el Bran "cuervo de 3 ojos", tan misticisme i res, assegut i ho deixa passar tot. Després la dolenta, dolenta, també pim-pam. Massa ràpid tot plegat. Serà l'edat.
Així que sí, que està bé, però no tan bé com temporades anteriors. Crec que podrien haver trobat finals molt millors, i no em refereixo a millor de feliç.
El petit hashejador ha rebut queixes del seu usuari principal, jo, i clar el desenvolupador ha tingut que fer-li cas, jo mateix. Així que l'he afegit algunes funcionalitats més.
"crea path [-r] [-desde_cero]:" crea un fitxer XML amb els Hash dels fitxers. -r indica recursiu. -desde_cero: esborra els fitxers de hashos existents. Si no es posa aquesta opció si ja existeix el fitxeret de hashos es salta la carpeta.
"verifica path [-r] [-continua]" verifica que els fitxers tinguin el Hash correcte, -r indica recursiu, -continua no verifica els fitxers en estat VERIFICAT. Clar hem vaig trobar que el procés de verificació de moooolts fitxers triga, i volia un procés que pugui ser interromput i que continuï des d'on ho va deixar en un altra moment. La verificació guarda el fitxer de hashos cada 5GB de fitxers processat i quan acaba de verificar la carpeta.
"resultats path [-r]" no calcula hashos, llegeix els fitxers del hasher buscant fitxers amb modificacions, errors i esborrats. -r indica recursiu. Si deixes la finestra amb el verifica fent, clar, potser et perds els errors o algo. Aleshores el resultats els ensenya.
"actualitza path [-r]" calcula hashos per fitxers nous, esborra del fitxer de hashos els que pertanyen a fitxers esborrats, -r indica recursiu.
"reset path [-r]" reseteja l'estat a PENDENT, -r indica recursiu. Clar, el verifica posa l'estat del fitxer a "VERIFICAT", cal doncs alguna forma de tornar a començar sense crear el fitxer de cero. Així es poden llançar verificacions en diferents dies. Primer un "reset" i després un "verifica".
Com sempre el codi, primer l'aplicació de consola, després la clase:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace Hasher
{
classProgram
{
privatestaticstring ExecutablePath = "";
privatestaticstring CarpetaAProcessar = "";
privatestaticbool Recursiu = false;
privatestaticbool Creacio_de_cero = false;
privatestaticstring Accio = "";
privatestaticbool Continua = false;
staticvoid Main(string[] args)
{
string AppPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
ExecutablePath = Path.GetDirectoryName(AppPath);
try
{
if (args.Length > 0)
{
ParseParams(args);
if (CarpetaAProcessar != "")
{
if (!Directory.Exists(CarpetaAProcessar))
{
Console.WriteLine("Carpeta no trobada: " + CarpetaAProcessar);
return;
}
}
else
{
Console.WriteLine("Carpeta a processar no informada");
return;
}
switch (Accio)
{
case"crea":
crea(CarpetaAProcessar);
Console.WriteLine(ObtenirData() + " - creació acabada.");
break;
case"verifica":
verifica(CarpetaAProcessar);
Console.WriteLine(ObtenirData() + " - verificació acabada.");
break;
case"resultats":
resultats(CarpetaAProcessar);
Console.WriteLine(ObtenirData() + " - obtenir resultats acabat.");
break;
case"actualitza":
actualitza(CarpetaAProcessar);
Console.WriteLine(ObtenirData() + " - actualitza acabat.");
break;
case"reset":
reset(CarpetaAProcessar);
Console.WriteLine(ObtenirData() + " - reset acabat.");
break;
default:
Console.WriteLine("Possibles parametres:");
Console.WriteLine("\"crea path [-r] [-desde_cero]\" crea un fitxer XML amb els Hash dels fitxers. "
+ "-r indica recursiu. -desde_cero: esborra els fitxers de hashos existents.");
Console.WriteLine("\"verifica path [-r] [-continua]\" verifica que els fitxers tinguin el Hash correcte, "
+ "-r indica recursiu, -continua no verifica els fitxers en estat VERIFICAT");
Console.WriteLine("\"resultats path [-r]\" no calcula hashos, llegeix els fitxers del hasher buscant "
+ " fitxers amb modificacions, -r indica recursiu");
Console.WriteLine("\"actualitza path [-r]\" calcula hashos per fitxers nous, "
+ "esborra del fitxer de hashos els que pertanyen a fitxers esborrats, -r indica recursiu");
Console.WriteLine("\"reset path [-r]\" reseteja l'estat a PENDENT, -r indica recursiu");
break;
}
}
else
{
Console.WriteLine("Possibles parametres:");
Console.WriteLine("Possibles parametres:");
Console.WriteLine("\"crea path [-r] [-desde_cero]\" crea un fitxer XML amb els Hash dels fitxers. "
+ "-r indica recursiu. -desde_cero: esborra els fitxers de hashos existents.");
Console.WriteLine("\"verifica path [-r] [-continua]\" verifica que els fitxers tinguin el Hash correcte, "
+ "-r indica recursiu, -continua no verifica els fitxers en estat VERIFICAT");
Console.WriteLine("\"resultats path [-r]\" no calcula hashos, llegeix els fitxers del hasher buscant "
+ " fitxers amb modificacions, -r indica recursiu");
Console.WriteLine("\"actualitza path [-r]\" calcula hashos per fitxers nous, "
+ "esborra del fitxer de hashos els que pertanyen a fitxers esborrats, -r indica recursiu");
Console.WriteLine("\"reset path [-r]\" reseteja l'estat a PENDENT, -r indica recursiu");
}
}
catch(Exception Err)
{
Console.WriteLine(Err.Source + " - " + Err.TargetSite + "-" + Err.Message);
}
}
privatestaticvoid reset(string pPath)
{
if (!File.Exists(pPath + "\\hasher.xml"))
{
Console.WriteLine(ObtenirData() + " - No hi ha fitxer de hashos: " + pPath);
}
else
{
Dictionary<string, clsFitxer> DicFitxers;
DicFitxers = CarregaHashos(pPath);
Console.WriteLine(ObtenirData() + " - resetejant: " + pPath);
foreach (KeyValuePair<String, clsFitxer> objFitxer in DicFitxers)
{
objFitxer.Value.Estat = "PENDENT";
}
Save(pPath, DicFitxers);
}
if (Recursiu)
{
string[] Carpetes = Directory.GetDirectories(pPath);
foreach (string Carpeta in Carpetes)
{
reset(Carpeta);
}
}
}
publicstaticstring SHA256HashFile(string sPath)
{
string sHash = "";
using (var stream = new BufferedStream(File.OpenRead(sPath), 2400000))
{
SHA256CryptoServiceProvider sha256h = new SHA256CryptoServiceProvider();
sHash = BitConverter.ToString(sha256h.ComputeHash(stream));
}
return sHash;
}
privatestaticvoid actualitza(string pPath)
{
if (!File.Exists(pPath + "\\hasher.xml"))
{
Console.WriteLine(ObtenirData() + " - No hi ha fitxer de hashos: " + pPath);
}
else
{
Dictionary<string, clsFitxer> DicFitxers;
Dictionary<string, clsFitxer> FitxersActualitzats = newDictionary<string, clsFitxer>();
clsFitxer FitxerActualitzat = null;
DicFitxers = CarregaHashos(pPath);
DirectoryInfo dir = newDirectoryInfo(pPath);
FileInfo[] Fitxers = dir.GetFiles();
Console.WriteLine(ObtenirData() + " - Processant " + pPath);
//Comprovar que tots els fitxers del fitxer de hashos estan al disc, treure els que no estanforeach (KeyValuePair<String, clsFitxer> objFitxer in DicFitxers)
{
try
{
if (File.Exists(pPath + "\\ " + objFitxer.Value.Nom))
{
FitxerActualitzat = new clsFitxer(objFitxer.Value.Nom,
objFitxer.Value.DataCreacio,
objFitxer.Value.DataVerificacio,
objFitxer.Value.MidaEnBytes,
objFitxer.Value.Hash,
objFitxer.Value.Estat);
FitxersActualitzats.Add(FitxerActualitzat.Nom, FitxerActualitzat);
}
}
catch (IOException e)
{
Console.WriteLine("I/O Exception: " + e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("Access Exception: " + e.Message);
}
}
//Comprovar que els fitxers de la carpeta estan, afegir els nousforeach (FileInfo Fitxer in Fitxers)
{
if (!DicFitxers.ContainsKey(Fitxer.Name))
{
if (Fitxer.Name.ToLower() != "hasher.exe" && Fitxer.Name.ToLower() != "hasher.xml")
{
string hashValueStr = SHA256HashFile(Fitxer.FullName);
Console.WriteLine(ObtenirData() + " - hashejat: " + Fitxer.Name);
FitxerActualitzat = new clsFitxer(Fitxer.Name, DateTime.Now,
DateTime.Now,
Fitxer.Length,
hashValueStr,
"CREAT");
FitxersActualitzats.Add(Fitxer.Name, FitxerActualitzat);
}
}
}
Save(pPath, FitxersActualitzats);
}
if (Recursiu)
{
string[] Carpetes = Directory.GetDirectories(pPath);
foreach (string Carpeta in Carpetes)
{
actualitza(Carpeta);
}
}
}
privatestaticvoid ParseParams(string[] args)
{
for(int i = 0; i<args.Length; i++)
{
if(args[i].ToLower() == "crea")
{
Accio = "crea";
}
if (args[i].ToLower() == "verifica")
{
Accio = "verifica";
}
if (args[i].ToLower() == "resultats")
{
Accio = "resultats";
}
if (args[i].ToLower() == "actualitza")
{
Accio = "actualitza";
}
if (args[i].ToLower() == "reset")
{
Accio = "reset";
}
if (args[i].ToLower() == "-r")
{
Recursiu = true;
}
if (args[i].ToLower() == "-desde_cero")
{
Creacio_de_cero = true;
}
if (args[i].ToLower() == "-continua")
{
Continua = true;
}
if(args[i].Contains(":"))
{
CarpetaAProcessar = args[i].Replace("\\\\ ", "\\ ");
}
}
}
privatestaticvoid resultats(string pPath)
{
if (!File.Exists(pPath + "\\hasher.xml"))
{
Console.WriteLine(ObtenirData() + " - No hi ha fitxer de hashos: " + pPath);
}
else
{
Dictionary<string, clsFitxer> DicFitxers;
DicFitxers = CarregaHashos(pPath);
Console.WriteLine(ObtenirData() + " - analitzant: " + pPath);
foreach (KeyValuePair<String, clsFitxer> objFitxer in DicFitxers)
{
if(objFitxer.Value.Estat == "NO COINCIDEIX")
{
Console.WriteLine(ObtenirData(objFitxer.Value.DataVerificacio)
+ " - fitxer amb hash canviat: " + pPath + "\\ " + objFitxer.Value.Nom);
}
else
{
if(objFitxer.Value.Estat.Contains("MIDA DIFERENT"))
{
Console.WriteLine(ObtenirData(objFitxer.Value.DataVerificacio)
+ " - fitxer amb mida diferent: " + pPath + "\\ " + objFitxer.Value.Nom);
}
else
{
if (objFitxer.Value.Estat == "ESBORRAT")
{
Console.WriteLine(ObtenirData(objFitxer.Value.DataVerificacio)
+ " - fitxer esborrat: " + pPath + "\\ " + objFitxer.Value.Nom);
}
}
}
}
}
if (Recursiu)
{
string[] Carpetes = Directory.GetDirectories(pPath);
foreach (string Carpeta in Carpetes)
{
resultats(Carpeta);
}
}
}
publicstaticstring ObtenirData(DateTime data)
{
return data.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
}
publicstaticstring ObtenirData()
{
returnDateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
}
publicstaticvoid verifica(string pPath)
{
long GBHashejats = 0;
Console.WriteLine(ObtenirData() + " - verificant carpeta: " + pPath);
if (!File.Exists(pPath + "\\hasher.xml"))
{
Console.WriteLine(ObtenirData() + " - No hi ha fitxer de hashos: " + pPath);
}
else
{
Dictionary<string, clsFitxer> DicFitxers;
DicFitxers = CarregaHashos(pPath);
foreach (KeyValuePair<String, clsFitxer> objFitxer in DicFitxers)
{
if (objFitxer.Value.Estat == "VERIFICAT" && Continua)
{
Console.WriteLine(ObtenirData() + " - fitxer ja verificat anteriorment: " + objFitxer.Value.Nom);
}
else
{
try
{
if (File.Exists(pPath + "\\ " + objFitxer.Value.Nom))
{
FileInfo fiFitxer = newFileInfo(pPath + "\\ " + objFitxer.Value.Nom);
if (fiFitxer.Length != objFitxer.Value.MidaEnBytes)
{
Console.WriteLine(ObtenirData() + " - Fitxer amb mida diferent: " + fiFitxer.Name);
objFitxer.Value.Estat = "MIDA DIFERENT, actual: " + fiFitxer.Length;
}
else
{
GBHashejats += fiFitxer.Length;
string hashValueStr = SHA256HashFile(fiFitxer.FullName);
if (hashValueStr == objFitxer.Value.Hash)
{
objFitxer.Value.Estat = "VERIFICAT";
}
else
{
Console.WriteLine(ObtenirData() + " - Fitxer amb hash canviat: " + fiFitxer.Name);
objFitxer.Value.Estat = "NO COINCIDEIX";
}
if(GBHashejats > 5368709120) //5 GB
{
GBHashejats = 0;
Save(pPath, DicFitxers);
}
}
}
else
{
Console.WriteLine(ObtenirData() + " - Fitxer esborrat: " + objFitxer.Value.Nom);
objFitxer.Value.Estat = "ESBORRAT";
}
objFitxer.Value.DataVerificacio = DateTime.Now;
}
catch (IOException e)
{
Console.WriteLine("I/O Exception: " + e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("Access Exception: " + e.Message);
}
}
}
Save(pPath, DicFitxers);
}
if (Recursiu)
{
string[] Carpetes = Directory.GetDirectories(pPath);
foreach(string Carpeta in Carpetes)
{
verifica(Carpeta);
}
}
}
publicstaticDictionary<string, clsFitxer> CarregaHashos(string pPath)
{
XmlDocument Doc = newXmlDocument();
XmlNode Fitxers;
XmlNodeList llistaDeFitxer;
XmlNode Nom;
XmlNode Hash;
XmlNode DataCreacio;
XmlNode DataVerificacio;
XmlNode Estat;
XmlNode MidaEnBytes;
clsFitxer objFitxer = null;
Dictionary<string, clsFitxer> DicFitxers = newDictionary<string, clsFitxer>();
Doc.Load(pPath + "\\hasher.xml");
Fitxers = Doc.SelectSingleNode("descendant::fitxers");
llistaDeFitxer = Fitxers.ChildNodes;
foreach (XmlNode Fitxer in llistaDeFitxer)
{
objFitxer = new clsFitxer();
Nom = Fitxer.SelectSingleNode("descendant::nom");
Hash = Fitxer.SelectSingleNode("descendant::hash");
DataCreacio = Fitxer.SelectSingleNode("descendant::datacreacio");
DataVerificacio = Fitxer.SelectSingleNode("descendant::dataverificacio");
Estat = Fitxer.SelectSingleNode("descendant::estat");
MidaEnBytes = Fitxer.SelectSingleNode("descendant::midaenbytes");
objFitxer.Nom = Nom.InnerText;
objFitxer.Hash = Hash.InnerText;
objFitxer.DataCreacio = DateTime.ParseExact(DataCreacio.InnerText, "dd/MM/yyyy HH:mm:ss", null);
objFitxer.DataVerificacio = DateTime.ParseExact(DataVerificacio.InnerText, "dd/MM/yyyy HH:mm:ss", null);
objFitxer.Estat = Estat.InnerText;
objFitxer.MidaEnBytes = long.Parse(MidaEnBytes.InnerText);
DicFitxers.Add(objFitxer.Nom, objFitxer);
}
return DicFitxers;
}
publicstaticvoid crea(string pPath)
{
bool Procesa_carpeta = false;
if (File.Exists(pPath + "\\hasher.xml"))
{
if (Creacio_de_cero)
{
File.Delete(pPath + "\\hasher.xml");
Console.WriteLine(ObtenirData() + " - Carpeta " + pPath + " amb fitxer de hashos, esborrat.");
Procesa_carpeta = true;
}
else
{
Console.WriteLine(ObtenirData() + " - Carpeta " + pPath + " amb fitxer de hashos, no procesada.");
Procesa_carpeta = false;
}
}
if (Procesa_carpeta)
{
Console.WriteLine(ObtenirData() + " - creant fitxer hashos: " + pPath);
DirectoryInfo dir = newDirectoryInfo(pPath);
FileInfo[] files = dir.GetFiles();
clsFitxer objFitxer = null;
Dictionary<string, clsFitxer> DicFitxers = newDictionary<string, clsFitxer>();
foreach (FileInfo Fitxer in files)
{
try
{
if (Fitxer.Name.ToLower() != "hasher.exe" && Fitxer.Name.ToLower() != "hasher.xml")
{
string hashValueStr = SHA256HashFile(Fitxer.FullName);
Console.WriteLine(ObtenirData() + " - hashejat: " + Fitxer.Name);
objFitxer = new clsFitxer(Fitxer.Name,
DateTime.Now,
DateTime.Now,
Fitxer.Length,
hashValueStr,
"CREAT");
DicFitxers.Add(Fitxer.Name, objFitxer);
}
}
catch (IOException e)
{
Console.WriteLine("I/O Exception: " + e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("Access Exception: " + e.Message);
}
}
Save(pPath, DicFitxers);
}
if (Recursiu)
{
string[] Carpetes = Directory.GetDirectories(pPath);
foreach (string Carpeta in Carpetes)
{
crea(Carpeta);
}
}
}
publicstaticvoid Save(string pPath, Dictionary<string, clsFitxer> DicFitxers)
{
XmlDocument Doc = newXmlDocument();
XmlNode Fitxers;
XmlNode Fitxer;
XmlNode Nom;
XmlNode Hash;
XmlNode DataCreacio;
XmlNode DataVerificacio;
XmlNode Estat;
XmlNode MidaEnBytes;
Doc.LoadXml("<?xml version=\ "1.0\ " standalone=\ "yes\ "?><fitxers></fitxers>");
Fitxers = Doc.SelectSingleNode("descendant::fitxers");
foreach (KeyValuePair<String, clsFitxer> objFitxer in DicFitxers)
{
Fitxer = Doc.CreateNode(XmlNodeType.Element, "fitxer", "");
Nom = Doc.CreateNode(XmlNodeType.Element, "nom", "");
Hash = Doc.CreateNode(XmlNodeType.Element, "hash", "");
DataCreacio = Doc.CreateNode(XmlNodeType.Element, "datacreacio", "");
DataVerificacio = Doc.CreateNode(XmlNodeType.Element, "dataverificacio", "");
Estat = Doc.CreateNode(XmlNodeType.Element, "estat", "");
MidaEnBytes = Doc.CreateNode(XmlNodeType.Element, "midaenbytes", "");
Nom.InnerText = objFitxer.Value.Nom;
Hash.InnerText = objFitxer.Value.Hash;
DataCreacio.InnerText = ObtenirData(objFitxer.Value.DataCreacio);
DataVerificacio.InnerText = ObtenirData(objFitxer.Value.DataVerificacio);
Estat.InnerText = objFitxer.Value.Estat;
MidaEnBytes.InnerText = objFitxer.Value.MidaEnBytes.ToString();
Fitxer.AppendChild(Nom);
Fitxer.AppendChild(Hash);
Fitxer.AppendChild(DataCreacio);
Fitxer.AppendChild(DataVerificacio);
Fitxer.AppendChild(Estat);
Fitxer.AppendChild(MidaEnBytes);
Fitxers.AppendChild(Fitxer);
}
Doc.Save(pPath + "\\hasher.xml");
}
}
}
Ara la clase:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Hasher
{
class clsFitxer
{
publicstring Nom { get; set; }
publicDateTime DataCreacio { get; set; }
publicDateTime DataVerificacio { get; set; }
publiclong MidaEnBytes { get; set; }
publicstring Hash { get; set; }
publicstring Estat { get; set; }
public clsFitxer()
{
}
public clsFitxer(string pNom,
DateTime pDataCreacio,
DateTime pDataVerificacio,
long pMidaEnBytes,
string pHash,
string pEstat)
{
Nom = pNom;
DataCreacio = pDataCreacio;
DataVerificacio = pDataVerificacio;
MidaEnBytes = pMidaEnBytes;
Hash = pHash;
Estat = pEstat;
}
}
}
#29/07/2019 09:28 Programació C# Autor: Alex Canalda
Quan es rep un pendrive o un disc extern que s'ha connectat a un Mac, si el Mac ha obert els fitxers al seu temps crea uns altres fitxerets molt monos i molestos que tenen el mateix nom que l'original però comencen amb "._larestadelnom" (comencen per punt i underscore) i ocupen molt poc. En un PC no serveixen de res apart d'ocupar sectors sencers del disc. Jo els elimino, però fer-ho manualment no mola. Així que he trobat aquesta instrucció de Powershell que ho fa ràpid, ràpid.
Quan s'estableix una comunicació amb un servidor es pot fer xifrada. Actualment gairebé totes les connexions són xifrades, es coneix com SSL. En una connexió SSL normalment s'identifica el servidor, el client que es connecta no. Però els servidors poden anar un pas més enllà i demanar al client que s'identifiqui. Això es coneix amb varis noms, 2-way SSL, 2WSSL o Mutual authentication.
Quan es programa s'ha de tenir en compte que calen uns passos extra per configurar la connexió. Cal afegir un certificat que identifiqui al client i que alguna CA (certificate authority) del servidor validi (reconegui). El curiós és que el certificat acostuma a estar guardat en un fitxer P12, però un contenidor P12 pot tenir més d'un al seu interior. No he trobat en la llibreria C# d'accés al P12 cap forma d'accedir posant el nom del certificat. Així que millor posar un P12 que contingui un únic certificat. Les variables CertStorageP12, PwdCertStorage són la ruta d'accés al fitxer (el path amb el nom del fitxer) i la contrasenya.
Segons els biòlegs, el terme "venomous" s'aplica a organismes que mosseguen o piquen per injectar toxines. El terme "poisonous" s'aplica a organismes que descarreguen les seves toxines quan els menges. Això vol dir que les serps i aranyes són "venomous" mentre que els bolets són "poisonous". Ambdós termes es tradueixen com verinosos, una única paraula en català.