2015-01-15 29 views
0

我試圖編譯我的web應用程序的不過我有一點麻煩抓住了文件的路徑在C用C抓取文件路徑+ WebkitGTK

在PyGTK的我在C.本地桌面應用程序將使用...

import webkit, pygtk, gtk, os 

path=os.getcwd() 
print path 
web_view.open("file://" + path + "/index.html") 

但是我不知道如果我只是找錯了地方或者什麼,但是當我搜索谷歌我一直無法找出如何抓住文件在C中我想用這樣的路徑。

gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file://" + path + "app/index.html"); 

而是在像這樣一個怪誕的方式鏈接到它的...

gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file://" + /home/michael/Desktop/kodeWeave/linux/app/index.html"); 
webkit_web_view_open (web_view, uri); 

這裏是我的整個項目(如果有用)。

#include <stdio.h> 
#include <string.h> 
#include <gtk/gtk.h> 
#include <webkit/webkit.h> 

static WebKitWebView* web_view; 

void on_window_destroy (GtkObject *object, gpointer user_data) { 
    gtk_main_quit(); 
} 

int main (int argc, char *argv[]) { 
    GtkBuilder *builder; 
    GtkWidget *window; 
    GtkWidget *scrolled_window; 

    gtk_init(&argc, &argv); 

    builder = gtk_builder_new(); 
    gtk_builder_add_from_file (builder, "browser.xml", NULL); 
    window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
    scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow1")); 
    g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL); 

    gtk_window_set_title(GTK_WINDOW(window), "kodeWeave"); 

    web_view = WEBKIT_WEB_VIEW (webkit_web_view_new()); 
    gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (web_view)); 

    gtk_builder_connect_signals (builder, NULL); 

    g_object_unref (G_OBJECT (builder)); 

    gchar* uri = (gchar*) (argc > 1 ? argv[1] : "file:///home/michael/Desktop/kodeWeave/linux/app/index.html"); 
    webkit_web_view_open (web_view, uri); 

    gtk_widget_grab_focus (GTK_WIDGET (web_view)); 
    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
} 

回答

1

您不能使用+運算符來連接在C字符串,您可能需要snprintf代替,首先你需要一個足夠大的緩衝區,可能是恆定的PATH_MAX將工作,它在limits.h定義,所以對於例如

char uri[PATH_MAX]; 
char cwd[PATH_MAX]; 

getcwd(cwd, sizeof(cwd)); 

if (argc > 1) 
    snprintf(uri, sizeof(uri), "%s", argv[1]); 
else 
    snprintf(uri, sizeof(uri), "file://%s/index.html", cwd); 
    /*        ^%s specifier for^this char pointer */ 

+運營商與您的操作數,但以不同的方式,它只是執行指針運算,因爲操作數的指針。

+0

有沒有圍繞主要路徑?如果我移動文件夾,重命名目錄或在另一臺具有不同用戶名的計算機上使用,該怎麼辦?我不希望它依賴於特定的位置。 – 2015-01-15 18:22:25

+3

由於這是一個GTK +程序,並且GTK +使用GLib,[GLib有一堆字符串助手](https://developer.gnome.org/glib/unstable/glib-String-Utility-Functions.html),可避免需要一個靜態的,固定大小的緩衝區(注意在完成時你必須在運行時釋放內存)[以及比簡單字符串連接更適合構建URL的函數](https://developer.gnome.org/油嘴/不穩定/油嘴-URI-Functions.html)。 – andlabs 2015-01-15 18:32:39

+1

@andlabs不錯的鏈接,這非常有趣。但我相信OP會與這些函數混淆,因爲顯然OP不明白c中的字符串是如何可能的以及如何處理它們。 – 2015-01-15 18:34:54