split file
Moderatore: Staff
Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
split file
Ciao a tutti,
avrei bisogno di un programma open source per dividere un file di grosse dimensioni in files più piccoli. Avrei bisogno che esistesse anche (o solo) la versione per Windows. Ho provato a cercare qualcosa, ne ho trovati di freeware, ma non open source. Sapete aiutarmi?
avrei bisogno di un programma open source per dividere un file di grosse dimensioni in files più piccoli. Avrei bisogno che esistesse anche (o solo) la versione per Windows. Ho provato a cercare qualcosa, ne ho trovati di freeware, ma non open source. Sapete aiutarmi?
- masalapianta
- Iper Master

- Messaggi: 2775
- Iscritto il: lun 25 lug 2005, 0:00
- Nome Cognome: famoso porco
- Kernel: uname -r
- Desktop: awesome
- Distribuzione: Debian
- Località: Roma
- Contatta:
- useless
- Staff

- Messaggi: 3896
- Iscritto il: dom 12 ott 2003, 0:00
- Località: A place where the streets have no name
- Contatta:
tempo fa (in DOS) ho scritto questo, devo dire che funziona +ttosto bene. consideratelo GPL:
Codice: Seleziona tutto
/* SukkoSplit
Note: The program will overwrite any existing files without confirmation.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#define MAX_FILENAME 13
#define BUF_SIZE 1024
#define VERSION "0.7 (08/09/2001)"
void show_welcome (void);
void show_usage (char *prog_name);
long int get_file_size (char *filename);
int do_split (FILE *f_in, char *filename, long int file_size,
long int part_size, int parts, int tracks);
int main (int argc, char *argv[]) {
int out;
char mode;
out = EXIT_SUCCESS;
show_welcome ();
if (argc != 4 || ((mode = tolower (argv[1][1])) != 'p' && mode != 's' &&
mode != 'a')) {
show_usage (argv[0]);
out = EXIT_FAILURE;
} else {
FILE *f_in;
char *filename;
long int file_size;
filename = argv[2];
file_size = get_file_size (filename);
if ((f_in = fopen (filename, "rb")) == NULL) {
fprintf (stderr, "Cannot open file \"%s\".\n", filename);
out = EXIT_FAILURE;
} else {
long int parts, part_size;
int tracks;
/* Start as non -a mode */
tracks = 0;
/* Select operating mode */
if (mode == 'p') {
parts = strtol (argv[3], NULL, 10);
part_size = file_size / parts + (file_size % parts != 0);;
printf ("File size is %ld bytes, so it will be splitted into %d bytes long"
" parts.\n", file_size, part_size);
} else if (mode == 's') {
part_size = strtol (argv[3], NULL, 10);
parts = file_size / part_size + (file_size % part_size != 0);
printf ("File size is %ld bytes, so it will be splitted into %d parts.\n",
file_size, parts);
} else if (mode == 'a') {
/* Extract tracks from an 'Amiga Disk File' (ADF) */
long int b;
parts = strtol (argv[3], NULL, 10);
part_size = file_size / parts + (file_size % parts != 0);
for (tracks = 0; (b = tracks * 512 * 11 * 2) < part_size; tracks++)
;
printf ("File size is %ld bytes, so it will be splitted into %d"
" parts, each %ld bytes long and containing %d tracks.\n",
file_size, parts, b, tracks);
part_size = b;
}
if (parts <= 1) {
printf ("It's no use splitting a file in a single part ;).\n");
out = EXIT_FAILURE;
} else
out = do_split (f_in, filename, file_size, part_size, parts, tracks);
fclose (f_in);
}
}
return (out);
}
void show_welcome (void) {
fprintf (stderr, "*** SukkoSplit V %s\n"
" by SukkoPera (enjoy.the.silence@iol.it) ***\n\n",
VERSION);
return;
}
void show_usage (char *prog_name) {
fprintf (stderr, "To split a file into parts of a given size:\n"
" -> %s -s <file> <size_in_bytes>\n\n"
"To split a file into a given number of parts:\n"
" -> %s -p <file> <number_of_parts>\n", prog_name,
prog_name);
return;
}
long int get_file_size (char *filename) {
struct stat ss;
stat (filename, &ss);
return ((long int) ss.st_size);
}
char *setup_part_name (char *filename, char *part_name, int part_no) {
char temp[5];
int i;
for (i = 0; filename[i] != '\0' && filename[i] != '.'; i++)
part_name[i] = filename[i];
/* NULL-terminate */
part_name [i] = '\0';
sprintf (temp, ".%03d", part_no);
strcat (part_name, temp);
return (part_name);
}
int do_split (FILE *f_in, char *filename, long int file_size,
long int part_size, int parts, int tracks) {
int out;
unsigned char *b;
out = EXIT_SUCCESS;
/* Memory for the file buffer is dynamically allocated */
if ((b = (unsigned char *) malloc (sizeof (char) * BUF_SIZE)) == NULL) {
fprintf (stderr, "Out of memory!\n");
out = EXIT_FAILURE;
} else {
int cur_part;
long int i, buf_length;
size_t r;
char part_name[MAX_FILENAME];
FILE *f_out;
cur_part = 0;
buf_length = 0;
while (++cur_part <= parts && out == EXIT_SUCCESS) {
/* Set up the filename for the current part */
setup_part_name (filename, part_name, cur_part);
if ((f_out = fopen (part_name, "wb")) == NULL) {
fprintf (stderr, "Cannot write to \"%s\"!\n", part_name);
out = EXIT_FAILURE;
} else {
if (!tracks)
printf ("Writing part %d (%s)...", cur_part, part_name);
else
printf ("Writing part %d (%s - Tracks %d to %d)...", cur_part,
part_name, (cur_part - 1) * tracks,
cur_part * tracks - 1 > 79 ? 79 : cur_part * tracks - 1);
/* If there's any valid data in the buffer, write them */
if (buf_length > 0) {
i = BUF_SIZE - buf_length;
fwrite (b + buf_length, sizeof (char), i, f_out);
} else
i = 0;
for (; i < part_size &&
(r = fread (b, sizeof (unsigned char), BUF_SIZE, f_in)) > 0;
i += r) {
buf_length = r;
/* Do not write the whole buffer if exceeding the part size */
if (i + r > part_size)
buf_length = part_size - i;
fwrite (b, sizeof (unsigned char), buf_length, f_out);
}
fclose (f_out);
/* Part end */
printf (" done");
if (i < part_size)
printf (" (%d bytes only)", i);
printf ("!\n");
}
}
}
/* Free used memory */
free (b);
return (out);
}