windows System.IO.文件是否封装SMB1.0/SMB2.0?

bzzcjhmw  于 2023-02-09  发布在  Windows
关注(0)|答案(2)|浏览(162)

我是SMB1.0/SMB2.0的新手,正在尝试使用https://github.com/TalAloni/SMBLibrary创建一个C#类库来封装基本的文件/目录操作,如复制、读取所有文本、删除等。
我的问题是:

  1. System.IO.File是否已经封装了SMB1.0/SMB2.0协议,并且我是否不需要使用第三方SMBLibrary?
    1.我编写了以下代码将文件从一个SMB共享移动到另一个SMB共享,但它只重命名文件,而不将文件从源位置移动到目标位置。
public bool Move(string sourceFilePath, string targetFilePath)
        {
            if (!CheckLoggedIn())
            {
                return false;
            }

            object fileHandle = null;
            _status = _store.CreateFile(out fileHandle,
                                       out FileStatus _,
                                       sourceFilePath,
                                       AccessMask.GENERIC_ALL | AccessMask.SYNCHRONIZE,
                                       FileAttributes.Normal,
                                       ShareAccess.Write,
                                       CreateDisposition.FILE_OPEN,
                                       CreateOptions.FILE_NON_DIRECTORY_FILE | CreateOptions.FILE_SYNCHRONOUS_IO_ALERT,
                                       null);

            if (_status == NTStatus.STATUS_SUCCESS)
            {
                _status = _store.SetFileInformation(fileHandle, new FileRenameInformationType2()
                {
                    FileName = targetFilePath
                });

                _status = _store.CloseFile(fileHandle);
            }

            return _status == NTStatus.STATUS_SUCCESS;
        }
eanckbw9

eanckbw91#

1.不,System.IO不包含SMB 1.0或SMB 2.0客户端。
1.为了将文件从一个共享移动到另一个共享,客户端必须从源共享读取文件的内容,然后将其内容写入第二个共享。必须以这种方式复制文件(然后从源中删除)。

zvms9eto

zvms9eto2#

我找到了EzSmbhttps://github.com/ume05rw/EzSmb库,您可以使用以下代码在同一SMB共享中移动文件:

// ** SMB1 NOT Supported. **

//using EzSmb;
//using System;
//using System.Threading.Tasks;

// Get Node of file.
var file = await Node.GetNode(@"192.168.0.1\ShareName\FileName.txt", "userName", "password");

// Move to child folder path.
// ** Even if you don't change the file/folder name, write the name. **
var movedFile = await file.Move(@"FolderName\RenamedFileName.txt");

Console.WriteLine(movedFile.FullPath);
// -> 192.168.0.1\ShareName\FolderName\RenamedFileName.txt

// Get Node of folder.
var folder = await Node.GetNode(@"192.168.0.1\ShareName\FolderName\SubFolderName", "userName", "password");

// Move to Parent path.
var movedFolder = await folder.Move(@"..\RenamedSubFolderName");

Console.WriteLine(movedFolder.FullPath);
// -> 192.168.0.1\ShareName\RenamedSubFolderName

相关问题