开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 160|回复: 3
收起左侧

[易语言] 哪个命令能打开便携设备文件夹地址

[复制链接]
结帖率:43% (3/7)
发表于 2025-3-29 18:57:18 | 显示全部楼层 |阅读模式   天津市天津市
11精币
哪个命令能打开便携设备文件夹地址,此电脑\Switch\5: MicroSD 安装    一开始我是想把文件置剪贴板 复制进去,后面发现便携设备不能粘贴外部文件
现在想用看看有别的办法吗 可以打开传入文件


补充内容 (2025-3-30 17:10):
经过测试  用精易模块的置剪贴板 无法粘贴到便携设备里  直接复制粘贴可以


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:43% (3/7)
 楼主| 发表于 2025-3-30 17:10:55 | 显示全部楼层   天津市天津市
有没有老哥 知道怎么解决的吗
回复

使用道具 举报

结帖率:43% (3/7)

签到天数: 9 天

发表于 2025-4-2 01:55:47 | 显示全部楼层   江西省九江市
ai回答如下
在C++中,可以通过Windows便携式设备(WPD)API将文件上传到MTP设备的某个路径。以下是基于WPD API实现文件上传的步骤和示例代码:




步骤


1. 初始化设备和会话:连接并枚举目标MTP设备,建立会话句柄。


2. 获取目标文件夹对象:通过设备的文件系统结构找到目标文件夹。


3. 创建文件对象:在目标文件夹中创建一个新文件对象。


4. 写入数据:将文件内容写入到新创建的文件对象中。


5. 关闭文件和清理资源:完成文件写入后,关闭文件对象并释放所有资源。




示例代码
以下是一个C++示例代码,展示如何将文件上传到MTP设备的指定路径:




```cpp
#include <windows.h>
#include <PortableDevice.h>
#include <PortableDeviceTypes.h>
#include <PortableDeviceApi.h>
#include <iostream>
#include <fstream>


#pragma comment(lib, "PortableDeviceGUIDs.lib")


// 打开MTP设备
HRESULT OpenMTPDevice(IPortableDevice** ppDevice, LPWSTR pwszPnpDeviceID)
{
    IPortableDeviceManager* pDeviceManager = nullptr;
    HRESULT hr = CoCreateInstance(__uuidof(PortableDeviceManager), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDeviceManager));
    if (FAILED(hr)) return hr;


    hr = pDeviceManager->GetDeviceIDs(1, &pwszPnpDeviceID);
    if (FAILED(hr)) return hr;


    hr = CoCreateInstance(__uuidof(PortableDevice), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDevice));
    if (FAILED(hr)) return hr;


    hr = (*ppDevice)->Open(pwszPnpDeviceID, PORTABLE_DEVICE_ACCESS_READWRITE);
    pDeviceManager->Release();
    return hr;
}


// 获取目标文件夹的ID
HRESULT GetFolderID(IPortableDevice* pDevice, LPCWSTR wszPath, PROPVARIANT* pFolderID)
{
    IPortableDeviceContent* pContent = nullptr;
    HRESULT hr = pDevice->Content(IID_PPV_ARGS(&pContent));
    if (FAILED(hr)) return hr;


    IPortableDeviceContent* pFolderContent = pContent;
    std::wstring path = wszPath;
    while (path.find(L"\\") != std::wstring::npos)
    {
        std::wstring folderName = path.substr(0, path.find(L"\\"));
        path = path.substr(path.find(L"\\") + 1);


        IPortableDeviceValues* pValues = nullptr;
        hr = pFolderContent->GetMetadata(folderName.c_str(), &pValues);
        if (FAILED(hr))
        {
            pFolderContent->Release();
            return hr;
        }


        PROPVARIANT pvFolderID;
        PropVariantInit(&pvFolderID);
        hr = pValues->GetValue(WPD_OBJECT_ID, &pvFolderID);
        pValues->Release();
        if (FAILED(hr))
        {
            pFolderContent->Release();
            return hr;
        }


        IPortableDeviceContent* pParentContent = pFolderContent;
        hr = pParentContent->GetContent(pvFolderID, IID_PPV_ARGS(&pFolderContent));
        pParentContent->Release();
        PropVariantClear(&pvFolderID);
        if (FAILED(hr)) return hr;
    }


    hr = pFolderContent->GetMetadata(path.c_str(), &pContent);
    if (FAILED(hr))
    {
        pFolderContent->Release();
        return hr;
    }


    hr = pContent->GetValue(WPD_OBJECT_ID, pFolderID);
    pFolderContent->Release();
    return hr;
}


// 上传文件到MTP设备
HRESULT UploadFileToMTPDevice(IPortableDevice* pDevice, LPCWSTR wszFolderPath, LPCWSTR wszFileName, LPCWSTR wszFilePath)
{
    PROPVARIANT pvFolderID;
    PropVariantInit(&pvFolderID);
    HRESULT hr = GetFolderID(pDevice, wszFolderPath, &pvFolderID);
    if (FAILED(hr)) return hr;


    IPortableDeviceContent* pContent = nullptr;
    hr = pDevice->Content(IID_PPV_ARGS(&pContent));
    if (FAILED(hr)) return hr;


    IPortableDeviceResources* pResources = nullptr;
    hr = pContent->Resources(IID_PPV_ARGS(&pResources));
    if (FAILED(hr)) return hr;


    std::ifstream file(wszFilePath, std::ios::binary);
    if (!file)
    {
        std::cerr << "Failed to open file." << std::endl;
        return E_FAIL;
    }


    std::vector<BYTE> buffer(std::istreambuf_iterator<char>(file), {});
    file.close();


    IPortableDeviceValues* pValues = nullptr;
    hr = CoCreateInstance(__uuidof(PortableDeviceValues), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pValues));
    if (FAILED(hr)) return hr;


    pValues->SetStringValue(WPD_OBJECT_NAME, wszFileName);
    pValues->SetGuidValue(WPD_OBJECT_FORMAT, WPD_FILE_FORMAT_UNKNOWN);
    pValues->SetUnsignedLargeIntegerValue(WPD_OBJECT_SIZE, buffer.size());
    pValues->SetGuidValue(WPD_OBJECT_PARENT_ID, pvFolderID);


    IPortableDeviceContent* pParentContent = nullptr;
    hr = pContent->CreateObjectWithPropertiesAndData(pValues, &pParentContent, nullptr, nullptr);
    if (FAILED(hr)) return hr;


    IPortableDeviceStream* pStream = nullptr;
    hr = pParentContent->GetStream(WPD_OBJECT_ID, &pStream);
    if (FAILED(hr)) return hr;


    hr = pStream->Write(buffer.data(), buffer.size(), nullptr);
    pStream->Release();
    pParentContent->Release();
    pValues->Release();
    pResources->Release();
    pContent->Release();
    PropVariantClear(&pvFolderID);


    return hr;
}


int main()
{
    CoInitializeEx(nullptr, COINIT_MULTITHREADED);


    IPortableDevice* pDevice = nullptr;
    LPWSTR pwszPnpDeviceID = nullptr;
    HRESULT hr = OpenMTPDevice(&pDevice, pwszPnpDeviceID);
    if (FAILED(hr))
    {
        std::cerr << "Failed to open MTP device." << std::endl;
        CoUninitialize();
        return -1;
    }


    LPCWSTR wszFolderPath = L"内部存储设备\\aa\\bb"; // 目标文件夹路径
    LPCWSTR wszFileName = L"example.txt";           // 目标文件名
    LPCWSTR wszFilePath = L"C:\\path\\to\\example.txt"; // 本地文件路径


    hr = UploadFileToMTPDevice(pDevice, wszFolderPath, wszFileName, wszFilePath);
    if (FAILED(hr))
    {
        std::cerr << "Failed to upload file to MTP device." << std::endl;
    }
    else
    {
        std::cout << "File uploaded successfully." << std::endl;
    }


    pDevice->Release();
    CoTaskMemFree(pwszPnpDeviceID);
    CoUninitialize();
    return 0;
}
```






代码说明


1. 设备连接和会话建立:通过`OpenMTPDevice`函数连接到MTP设备。


2. 获取目标文件夹ID:通过`GetFolderID`函数递归查找目标文件夹的ID。


3. 上传文件:通过`UploadFileToMTPDevice`函数将本地文件上传到目标文件夹。


4. 资源管理:在操作完成后,释放所有资源以避免内存泄漏。




注意事项


• 确保设备已正确连接并识别为MTP设备。


• 目标路径和文件名需要根据实际情况调整。


• 代码中未包含完整的错误处理逻辑,实际使用时需要进一步完善。


回复

使用道具 举报

结帖率:43% (3/7)
 楼主| 发表于 2025-4-2 13:18:01 | 显示全部楼层   天津市天津市
永痕 发表于 2025-4-2 01:55
ai回答如下
在C++中,可以通过Windows便携式设备(WPD)API将文件上传到MTP设备的某个路径。以下是基于WPD  ...

您这个看不懂啊  有E的例子吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表