请问如何远程读写文件,涉及哪些类和函数?请指点

解决方案 »

  1.   

    就用API的CreateFile,WriteFile等函数
    只要文件名带网络路径,windows会帮你定向的。
      

  2.   

    难道100分的问题就die在这里了吗?大家帮帮忙啊
    我查过msdn ,createfile不能够生成或打开一个远程文件,
    我想通过一个临时文件,将远程文件读过来
    在本地进行修改,这样就简单多了
    可是如何将文件的内容以视图的形式反映出来呢?
    这样只需在视图上修改,文件内容就可以改了
    请指教
      

  3.   

    远程计算机如果提供FTP服务,这个问题可以解决,使用类库或者SDK编程都可以写,我曾经写过类似的程序,如果想要,给我发短信息
      

  4.   

    to mfc168:
    我需要手动编写远程计算机的服务,而且读写的文件位置是固定的,所以不一定要求开FTP服务
    如果能有类似的程序最好了 ,先谢谢了^_^
      

  5.   

    我明白你的意思了,这个需要远程线程控制,我这里有类似代码,你可以修改一下,然后建立远程线程,用该线程实现文件的读写操作,代码如下(你需要修改,我没有时间改写):
    void EnableDebugPriv();
    CString pszLibFileName;//存放待隐藏的DLL文件名
    HANDLE hProcessSnap=NULL;//进程快照句柄
    HANDLE hRemoteProcess;//远程进程句柄
    LPVOID pszLibFileRemote;//远程进程中分配给文件名的空间
    HMODULE  phmd;//存放kernel32.dll句柄
    HANDLE hRemoteThread1=NULL;//存放远程线程句柄
    #include <tlhelp32.h>//void CMainFrame::OnInsert() 
    {
    EnableDebugPriv();
    PROCESSENTRY32 pe32={0};
    DWORD dwRemoteProcessId;
    hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    //打开进程快照
    if(hProcessSnap==(HANDLE)-1)
    {
    MessageBox("CreateToolhelp32Snapshot failed","",MB_OK);
    }  //失败返回 pe32.dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32)) //获取第一个进程
    {
    do{
    CString  te;
    te=pe32.szExeFile;
    if(te.CompareNoCase("explorer.exe")==0)
    {
    dwRemoteProcessId=pe32.th32ProcessID;
    break;
    }  
    }  
    while(Process32Next(hProcessSnap,&pe32));//获取下一个进程
    }
    else
    {
    MessageBox("取第一个进程失败","",MB_OK);
    return;
    } hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwRemoteProcessId);
    //打开远程进程
    char* pszLibFileName;
    CString m_path="E:\\LastFinal\\rj\\Slave\\Release\\Slave.dll";
    pszLibFileName=new char[m_path.GetLength()];
    sprintf(pszLibFileName,m_path);// 待隐藏的进程
    int cb=(m_path.GetLength())*sizeof(char)*2;//计算dll文件名长度
    pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,
    MEM_COMMIT,PAGE_READWRITE);
    VirtualFreeEx(hRemoteProcess,pszLibFileRemote,cb,MEM_RELEASE);
    //申请存放文件名的空间
    BOOL ReturnCode=WriteProcessMemory(hRemoteProcess,
    pszLibFileRemote,(LPVOID)pszLibFileName,cb,NULL);
    //把dll文件名写入申请的空间
    phmd=GetModuleHandle("kernel32.dll");
    LPTHREAD_START_ROUTINE fnStartAddr=(LPTHREAD_START_ROUTINE)
    GetProcAddress(phmd,"LoadLibraryA");
    //获取动态链接库函数地址
    hRemoteThread1=CreateRemoteThread(hRemoteProcess,
    NULL,0,fnStartAddr,pszLibFileRemote,0,NULL);
    //创建远程线程
    if(hRemoteThread1!=NULL)
    CloseHandle(hRemoteThread1);//关闭远程线程 if(hProcessSnap!=NULL)
    CloseHandle(hProcessSnap);//关闭进程快照 }
    //提升权限
    void EnableDebugPriv( void )
    {
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp; if ( ! OpenProcessToken( GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    {
    AfxMessageBox("openprocesstoken");
    return;
    }
    if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
    CloseHandle( hToken );
    {
    AfxMessageBox("close handle");
    return;
    }
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
    {
    CloseHandle( hToken );
    }
    }