GNOME 文件如何实现复制对话框?

GNOME 文件如何实现复制对话框?

对于简单的任务,我使用 GNOME 文件(Nautilus)来复制文件,而不是 rsync。我尝试挖掘源代码nautilus-文件操作.c我对此并不熟悉,我假设它使用自己的自定义实现(不是cp)进行错误处理和report_copy_progress?我不知道实际的系统调用在哪里发生。

答案1

我相信所有 GNOME 文件操作都使用 GFiles,根据描述

GFile 是用于在虚拟文件系统上操作文件的高级抽象。GFile 是轻量级、不可变的对象,在创建时不执行 I/O。必须了解的是,GFile 对象并不代表文件,而只是文件的标识符。所有文件内容 I/O 都以流式操作实现(请参阅 GInputStream 和 GOutputStream)。

因此 I/O 实际上是在输入流输出流.c,在类似函数中输入流读取,但这依赖于一些读取函数GInputStreamClassclass->read_fn,这取决于程序是从套接字、本地文件、win32 文件、可轮询流等进行流式传输。(我的猜测)

对于本地文件(我实际上找不到本地文件的定义,但我认为它是磁盘上的文件),g_local_file_input_stream_read我们最终找到了系统调用read 158 行

static gssize
g_local_file_input_stream_read (GInputStream  *stream,
                void          *buffer,
                gsize          count,
                GCancellable  *cancellable,
                GError       **error)
{
  GLocalFileInputStream *file;
  gssize res;

  file = G_LOCAL_FILE_INPUT_STREAM (stream);

  res = -1;
  while (1)
    {
      if (g_cancellable_set_error_if_cancelled (cancellable, error))
    break;
      res = read (file->priv->fd, buffer, count);
      if (res == -1)
    {
          int errsv = errno;

      if (errsv == EINTR)
        continue;

      g_set_error (error, G_IO_ERROR,
               g_io_error_from_errno (errsv),
               _("Error reading from file: %s"),
               g_strerror (errsv));
    }

      break;
    }

  return res;
}

同样地write称呼g_local_file_output_stream_write

static gssize
g_local_file_output_stream_write (GOutputStream  *stream,
                  const void     *buffer,
                  gsize           count,
                  GCancellable   *cancellable,
                  GError        **error)
{
  GLocalFileOutputStream *file;
  gssize res;

  file = G_LOCAL_FILE_OUTPUT_STREAM (stream);

  while (1)
    {
      if (g_cancellable_set_error_if_cancelled (cancellable, error))
    return -1;
      res = write (file->priv->fd, buffer, count);
      if (res == -1)
    {
          int errsv = errno;

      if (errsv == EINTR)
        continue;

      g_set_error (error, G_IO_ERROR,
               g_io_error_from_errno (errsv),
               _("Error writing to file: %s"),
               g_strerror (errsv));
    }

      break;
    }

  return res;
}

相关内容