paulo1205
(usa Ubuntu)
Enviado em 02/11/2017 - 02:44h
Será uma solução dependente do sistema operacional. Só por isso, então, não para dizer que dá para fazer “em C”, se considerarmos apenas a linguagem e a biblioteca padronizadas, se você não disser qual sistema operacional pretende usar.
No caso de sistemas UNIX-like, no entanto, geralmente dá, sim, para fazer com C padrão. Geralmente dispositivos de armazenamento são apresentados pelo sistema operacional como arquivos especiais dentro do diretório
/dev/ (por exemplo, algo como
/dev/sdb no Linux, ou
/dev/rsd1/
/dev/sd1 num BSD). Desde que você possua permissão, pode abrir esses pseudoarquivos com
fopen() e manipulá-los com
fread(),
fwrite(),
fseek(),
ftell() e
fclose() (dependendo do SO, pode ser forçado a obedecer algumas restrições, como sempre fazer operações de I/O em blocos com tamanhos que coincidem com o tamanho do setor/bloco do dispositivo, geralmente 512 ou 4096 bytes, no caso de discos e
pendrives, e 2048 bytes no caso de CDs e DVDs; por isso é mais seguro usar
fread()/
fwrite() do que I/O orientado a caráter, como
fgetc() ou a linha, como
fgets()).
Com essa característica de poder fazer I/O por meio do pseudoarquivo, você nem precisa de C. Dá para brincar de acesso de baixo nível com qualquer linguagem que permita abrir arquivos e fazer I/O orientado a blocos, tais como Perl, Python ou PHP.
Ter acesso é a parte mais fácil. Saber trabalhar com os dados presentes no disco (ou aqueles que você vai colocar ou modificar) é mais trabalhoso, e muito mais trabalhoso quanto mais genérico você quiser ser. Provavelmente você terá de lidar por conta própria com questões como saber se o dispositivo tem uma tabela de partição ou se foi usado inteiramente pelo SO, se o formato da tabela de partições é MBR, BSD disklabel, GPT ou algum outro, qual a estrutura e o sistema de arquivos em cada partição (FAT12, FAT16, FAT32, ExFAT/FAT64 (todos esse com ou sem vFAT), NTFS, HPFS, UFS, UFS2, ExtFS, ExtFS2, XFS, ZFS, JFS, ISO9660, UTF etc.), para conseguir saber o que pode constituir um arquivo, descobrir se ele continua íntegro (e.g. não foi apagado e parcialmente sobrescrito por pedação de algum outro arquivo) e poder navegar pelo seu conteúdo (porque seus blocos podem estar fragmentados e espalhados por diferentes regiões não-contíguas do disco) e para que suas eventuais modificações de conteúdo não corrompam os dados já gravados nem os deixe inconsistentes.