SAR
Ceci est la 1ère version d'un petit utilitaire en mode texte que j'ai réalisé pour mes besoins personnels. J'ai commencé à faire une documentation anglaise dans le but de le distribuer.

Avez-vous déjà eu un cd dont certains fichiers étaient partiellement illisibles? Moi oui, et je ne les compte plus. Il faut savoir que la durée de vie des cd est d'environ 5 ans pour les bonnes marques (très inférieure donc à la durée de vie des cassettes VHS par exemple qui dépassent facilement les 10 ans). Les symptômes d'un cd qui vieillit sont les suivants: le lecteur ralentit en fin de disque, et termine éventuellement sur une erreur.
  • Mais selon les lecteurs de CD-ROM utilisés, l'erreur peut ne pas se produire ou alors se produire à un autre endroit poru le même cd.
  • De plus, Windows (contrairement à Linux) se comporte d'une facon très imbécile: si il y a une erreur lors de la copie du fichier, il jette tout à la poubelle!!! Mais imaginez un seul instant qu'il s'agisse d'un fichier multimédia (vidéo ou son): même copiés partiellement, ces fichiers restent (en partie) utilisables. Imaginez en plus que ce soit une vidéo de 700Mo, dont seuls les 10 derniers Ko ont provoqué une erreur... Imaginez que le lecteur ait eu du mal avec la fin du cd et que la copie ait duré 1 heure... Après 1 heure, Windows jette 699Mo de données à la poubelle tout simplement parce qu'il manque les 5 dernières secondes du vidéo!!!!!!!!
Il me semblait évident qu'un utilitaire était nécessaire pour gérer ce genre de cas. Je l'ai donc réalisé. Il s'agit en fait d'un algorithme qui copie le fichier petit bout par petit bout.
  • Il commence à copier au hasard dans le fichier.
  • En cas d'erreur, l'algorithme choisit une autre position au hasard dans le fichier, ce qui lui perment de "forcer" le lecteur de cd-rom à tourner. En effet, nos systèmes d'exploitation copient le fichier du début à la fin, et réessayent la partie défectueuse en cas de besoin. Or, j'ai constaté un problème sous Windows et sous Linux avec différentes marques de lecteurs de cd-rom: insister sur la partie défectueuse peut "planter" le lecteur de cd-rom, il cesse définitivement de tourner et dit qu'il ne contient pas de cd ce qui est faux. Donc au lieu de réessayer jusqu'à-ce que mort s'en suive, mon programme passe à une autre partie du fichier et réessayera plus tard.
  • Il faut savoir que la fonction C++ copy fait tout ou rien: si on lui demande de copier 8Ko et qu'elle rencontre une erreur même si c'est juste sur 1 octet elle ne copiera rien. Une fois que mon programme a scanné le fichier au complet une 1ère fois, il réessaye les parties qu'il n'a pas pu lire avec une taille de copie élémentaire plus petite (de 8Ko par défaut il passe à 4Ko, 2Ko et ainsi de suite jusqu'à 1 octet). Cela permet de réessayer les parties défectueuses dans des conditions différentes et peut-être les copier dans le meilleur des cas, mais aussi de copier d'avantage de données autour de l'erreur physique sur le cd dans le pire des cas. Les parties défectueuses sont remplacées par des 0, et par exemple ca peut faire 10 secondes de parasites dans une vidéo d'1 heure pour 1Ko manquantce qui est acceptable par rapport à absolument rien avant.
  • En fin d'analyse, le programme liste à l'utilisateur les parties qu'il n'a pas été capable de copier. L'utilisateur peut donc réessayer ces parties avec un autre lecteur de CD-ROM (et seulement ces parties, inutile de recopier tout le reste du fichier) en les passant en paramètre au programme.
Jusqu'à présent grâce à ce programme, j'ai pu récupérer la quasi-totalité de mes cd défectueux. Parmi ces cd il y avait de divers cas qui ont aussi bien marché les uns que les autres: vieux cd, cd rayés... Pour vous donner une idée, sur une 20 cds défectueux, j'en ai récupéré totalement 18 (impressionnant quand on voyait l'état de certaines rayures parfois... des accidents ca arrive! :), et partiellement pour les 2 restants (ce qui est mieux que rien).

documentation anglaise (version RTF)
documentation anglaise (version HTML)
SAR 1.0 (archive RAR avec l'exécutable Windows, l'exécutable statique Linux (et donc tous-systèmes), le code source et la documentation)
(donc, ma 1ère version qui me suffit très bien, mais manque certainement encore de convivialité pour monsieur tout-le-monde)