Gtk# 剪贴板复制/剪切/粘贴文件

2023-12-02

如何使用 Gtk# 复制、剪切和粘贴文件到剪贴板。我见过的每个例子都只显示文本被放入剪贴板。如果有人有一个例子,我将不胜感激。


如果您的应用程序在 Gnome/Unity 上运行,您可以使用“x-special/gnome-copied-files”目标类型在剪贴板上移动/复制文件。复制文件后,您应该能够使用文件管理器粘贴它,反之亦然。下面是执行此操作的窗口类的示例:

using System;
using System.IO;
using Gtk;

public partial class MainWindow : Gtk.Window
{
    private static Gdk.Atom _atom = Gdk.Atom.Intern("CLIPBOARD", false);
    private Gtk.Clipboard _clipBoard = Gtk.Clipboard.Get(_atom);
    private Gtk.FileChooserButton _fileCopy = null;
    private Gtk.FileChooserButton _folder = null;
    private Gtk.RadioButton _radioCopy = null;
    private Gtk.RadioButton _radioMove = null;
    private System.Text.ASCIIEncoding _encoding = new System.Text.ASCIIEncoding();
    private string _action = null;
    private string _source = null;
    private string _destination = null;

    public MainWindow () : base(Gtk.WindowType.Toplevel)
    {
        SetDefaultSize(200, -1);

        var table = new Gtk.Table(5, 5, true);
        var separator = new Gtk.HSeparator();

        var label0 = new Gtk.Label("Select file to copy/move");
        _fileCopy = new Gtk.FileChooserButton("Select A File", Gtk.FileChooserAction.Open);
        _radioCopy = new Gtk.RadioButton("Copy");
        _radioMove = new Gtk.RadioButton(_radioCopy, "Move");
        var copyButton = new Gtk.Button("Copy");

        Add(table);

        table.Attach(label0, 0, 4, 0, 1);
        table.Attach(_fileCopy, 0, 1, 1, 2);
        table.Attach(_radioCopy, 1, 2, 1, 2);
        table.Attach(_radioMove, 2, 3, 1, 2);
        table.Attach(copyButton, 3, 4, 1, 2);
        table.Attach(separator, 0, 4, 2, 3);

        var label1 = new Gtk.Label("Select destination for file(s)");
        _folder = new Gtk.FileChooserButton("Select A File", Gtk.FileChooserAction.SelectFolder);
        var pasteButton = new Gtk.Button("Paste");

        table.Attach(label1, 0, 4, 3, 4);
        table.Attach(_folder, 0, 1, 4, 5);
        table.Attach(pasteButton, 3, 4, 4, 5);

        DeleteEvent += OnDeleteEvent;
        copyButton.Clicked += OnCopyButtonClick; 
        pasteButton.Clicked += OnPasteButtonClick;

        ShowAll();
    }

    private void ClearGet(Gtk.Clipboard clipboard, Gtk.SelectionData selection, uint info)
    {
        var temp = _action + "\n" + _source;
        selection.Set(selection.Target, 8, _encoding.GetBytes(temp)); 
    }

    private void ClearFunc(Gtk.Clipboard clipboard)
    {
        //???
    }

    private void ReceivedFunc(Gtk.Clipboard clipboard, Gtk.SelectionData selection)
    {
        var temp = _encoding.GetString(selection.Data);
        if (temp==null) return;

        var items = temp.Split();
        for (int i=1; i<items.Length; i++)
        {
            var fileFrom = items[i].Substring("file://".Length);
            var fileTo = System.IO.Path.Combine(_destination, System.IO.Path.GetFileName(fileFrom));
            if (items[0]=="copy")
                File.Copy(fileFrom, fileTo);
            else if (items[1]=="cut")
                File.Move(fileFrom, fileTo);
        }
    }

    private void OnCopyButtonClick(object obj, EventArgs args)
    {
        Console.WriteLine(_fileCopy.Uri);

        _source = _fileCopy.Uri;
        _action = _radioMove.Active ? "cut" : "copy";

        var target0 = new TargetEntry("x-special/gnome-copied-files", 0, 0);
        var target1 = new TargetEntry("text/uri-list", 0, 0);

        _clipBoard.SetWithData(new TargetEntry[] {target0, target1}, ClearGet, ClearFunc);
    }

    private void OnPasteButtonClick(object obj, EventArgs args)
    {
        _destination = _folder.Filename;
        _clipBoard.RequestContents(Gdk.Atom.Intern("x-special/gnome-copied-files", false), ReceivedFunc);
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}

希望这有帮助,问候

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gtk# 剪贴板复制/剪切/粘贴文件 的相关文章

随机推荐

  • 为什么我的模型预测相同的标签?

    我正在训练一个小型网络 训练似乎进展顺利 val 损失减少 验证准确度达到 80 左右 一旦没有更多改进 它实际上会停止训练 耐心 10 它训练了 40 个 epoch 然而 它只为每个测试图像预测一个类别 我尝试随机初始化转换层 我添加了
  • C# 正则表达式用于匹配嵌套括号内的特定文本

    我有这些代码行用于括号之间的运算符 string filtered Regex Replace input string Empty var result filtered Split new StringSplitOptions Remo
  • 逗号分隔值到单引号和逗号分隔值

    我的数据为 abc defg hijklm op qrs tuv 我希望将这些数据转换为 abc defg hijklm op qrs tuv 我想在linux下做 我使用 sed 我一直在互联网上查找 但没有找到解决方案 请帮我 在开头添
  • 核心数据不保存我的数据

    我使用核心数据来保存一些整数 速率 然后在上下文中调用 save HeartRateBeat beat HeartRateBeat heartRateWithHeartRate rate ofRecordTitle self recordT
  • 使用 Django 实现单点登录 (SSO) [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想使用 Django 为我们当前使用的多个应用程序实现单点登录 SSO 我如何使用 Django 来实现这个 我们正在使用 OpenAM http
  • 将 QWidget 渲染为 QImage 丢失 alpha 通道

    我有一个简单的 Qt 小部件 它是QLabel应用了简单的 CSS 样式 样式的重要部分是圆形边框 QString css border style solid border width 3px border radius 7px 它在屏幕
  • 反应js;映射数组后没有任何渲染

    我有一个输入 在用户插入文本后我想在按钮中显示每个单词button group 我拆分了句子并映射了返回的内容
  • 我应该使用哪种 java swing 布局

    我需要创建这个框架 我应该使用哪种布局 我正在考虑框或网格布局 但右侧的菜单将是一个问题 您的代码中有很多重复 我会分解每个部分 使其成为一个单独的组件 并专注于其单独的布局需求 主屏幕有 4 个主要区域 不包括菜单 我会用类似的东西Gri
  • 如何防止Mysql Connector/J转换DATE和TIME时区?

    我正在使用以下 DSN 连接到 mysql 服务器 jdbc mysql localhost my database useUnicode true characterEncoding utf 8 serverTimezone UTC 我遇
  • 反射类型没有方法

    我正在尝试在 Go 中使用反射 为什么这段代码没有列出方法 它列出了字段 这是问题所在吗 value interface 我不确定如何将通用结构 类 类型传递给函数 通常我只会传递一个对象 我对此完全陌生 我是一名 C 程序员 packag
  • 如何用 Objective-C 编写计时器?

    我正在尝试用 NSTimer 制作秒表 我给出了以下代码 nst Timer NSTimer scheduledTimerWithTimeInterval 0 001 target self selector selector showTi
  • 当我在tensorflow.keras中使用BinaryCrossentropy(from_logits=True)时,我应该使用什么作为目标向量

    我有一个多标签分类 其中每个目标都是由 1 和 0 组成的向量not相互排斥 为了清楚起见 我的目标是 0 1 0 0 1 1 到目前为止我的理解是 我应该使用二元交叉熵函数 正如本节中所解释的answer 另外 我明白了tf keras
  • 如何使用 Windows 计划任务运行 PHP 脚本?

    我已经在我的机器中安装了 localhost server 我需要使用 Windows 计划任务运行 php 脚本 如何在计划任务的 操作 选项卡中添加路径 配置脚本以在特定时间段运行 在系统上找到 php exe 可执行文件 并使用以下命
  • 在文本浏览器中实时显示 QProcess 输出

    我是 qt 开发的新手 我想将 QProcess 的输出实时传输到文本浏览器 我首先执行一个简单的 echo 命令 但程序的输出没有显示 我究竟做错了什么 QProcess p p start echo hye QByteArray byt
  • CSS中何时留出空间,何时不留出空间?

    这是可以的 没有空格 li highlight background FF9900 none repeat scroll 0 0 这不起作用 有空格 li highlight background FF9900 none repeat sc
  • 如何根据用户的选择动态生成SQL查询?

    这与以下问题是同一个问题 如何根据用户的选择动态生成SQL查询 唯一的区别是 我有兴趣看到也使用 Java JPA 可能是 EclipseLink 或 Hibernate 特定扩展 的解决方案 我需要创建一个 GUI 用户可以使用它选择多个
  • 获取错误的 FileChannel 大小

    我正在尝试获取其中包含的文件的大小assets 我正在使用一个FileChannel因为我需要一个FileChannel之后 文件myfile txt包含 7 个字节 这是我的代码 AssetManager amgr AssetFileDe
  • @Autowired 注释无法在 JUnit 类中注入 bean

    我的测试班 public class myTest extends TestCase Autowired BeanClass beanObject public void beanTest Classdata data beanObject
  • 循环依赖

    我有 2 个项目 项目 2 引用了项目 1 现在我需要在 Project 1 中引用 Project 2 但 vs net 抱怨循环依赖 有办法解决这个问题吗 绝对不 循环依赖是糟糕设计的表现 我并不是有意严厉 有一些方法可以解决这个问题
  • Gtk# 剪贴板复制/剪切/粘贴文件

    如何使用 Gtk 复制 剪切和粘贴文件到剪贴板 我见过的每个例子都只显示文本被放入剪贴板 如果有人有一个例子 我将不胜感激 如果您的应用程序在 Gnome Unity 上运行 您可以使用 x special gnome copied fil