C, GLib: есть ли способ получить размер - может ли он применяться к текстовому файлу, двоичному файлу, папке и символической ссылке совместно? - PullRequest
1 голос
/ 19 марта 2011
// gcc z.c -o z $(pkg-config --cflags --libs gtk+-2.0)
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
struct tst
{
    GtkWidget *win, *vb, *ent, *btn, *lbl;
    GtkAccelGroup *acc;
    GClosure *cls;
};
static void print_val(struct tst *prg)
{
    const char *nam = gtk_entry_get_text(GTK_ENTRY(prg->ent));
    char *cont;
    g_file_get_contents(nam, &cont, NULL, NULL);
    int siz = strlen(cont);
    g_printf("%d\n", siz);
}
static void window_new()
{
    struct tst *prg = g_new0(struct tst, 1);
    prg->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    prg->vb = gtk_vbox_new(TRUE, 0);
    prg->ent = gtk_entry_new();
    prg->btn = gtk_button_new_with_label("Print!");
    prg->lbl = gtk_label_new("Enter the string.");
    gtk_container_add(GTK_CONTAINER(prg->win), GTK_WIDGET(prg->vb));
    gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->ent), FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->btn), FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(prg->vb), GTK_WIDGET(prg->lbl), FALSE, FALSE, 0);
    g_signal_connect_swapped(prg->win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect_swapped(prg->btn, "clicked", G_CALLBACK(print_val), prg);
    gtk_window_set_title(GTK_WINDOW(prg->win), "Enter the string");
    gtk_widget_show_all(GTK_WIDGET(prg->win));
}
int main(int argc, char *argv[])
{
    gtk_init(&argc, &argv);
    window_new();
    gtk_main();
    return 0;
}

С помощью g_file_get_contents (), по крайней мере, в этом примере программы, я могу получить размер текстового файла, но не могу получить размер двоичного файла, папки и символической ссылки.

Когда я пытаюсь получить размер двоичного файла, он дает странное значение, а не размер двоичного файла.

Когда я пытаюсь получить размер папки с этим, он падает с ошибкой сегментации.

И когда я пытаюсь получить размер символической ссылки, он дает размер обычного файла, на который ссылается ссылка, а не самой ссылки.

Есть ли способ получить размер - может ли он применяться совместно к текстовому файлу, двоичному файлу, папке и символической ссылке?

Ответы [ 2 ]

1 голос
/ 19 марта 2011

Обычный способ

#include <sys/stat.h>

struct stat st;
if (lstat(filepath, &st) == -1) {
  perror(filepath);
  exit(1);
}
filesize = st.st_size;

Обратите внимание, что при lstat() сообщаемый размер будет размером самой символической ссылки, а не объекта, на который она ссылается; если вы на самом деле не хотите использовать собственный размер символической ссылки, используйте stat().

0 голосов
/ 19 марта 2011

Возможно, вам придется использовать realpath () для разрешения символических ссылок. После этого вы можете просто использовать fstat ().

struct stat *s;
int fd;

s = malloc(sizeof(struct stat));

fd = open("somefile", O_RDONLY);
fstat(fd, s);
printf("%d\n", s->st_size); 
...