首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过网络附加文本文件Android API SDK最少19

通过网络附加文本文件Android API SDK最少19
EN

Stack Overflow用户
提问于 2020-01-08 17:56:58
回答 1查看 48关注 0票数 0

我是一个相对较新的Java新手,在添加到文本文件时有一点困难。我可以创建并写入该文件,但如果该文件存在,我只能覆盖它。

我试图使用StandardOpenOption,但这需要SDK26(我正在为Android7或更高版本开发),这意味着我不能使用StandardOpenOption,因为Min。

有没有其他方法可以做到这一点?这是我目前正在运行的代码,这是使用hierynomus访问Windows网络路径的代码

代码语言:javascript
复制
import android.content.Context;
import com.hierynomus.msdtyp.AccessMask;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.mssmb2.SMB2CreateDisposition;
import com.hierynomus.mssmb2.SMB2CreateOptions;
import com.hierynomus.mssmb2.SMB2ShareAccess;
import com.hierynomus.mssmb2.SMBApiException;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.SmbConfig;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;

public class NetworkLogon {


    // connection paramsStaticLoggerBinder
    static String sambaDomain = null; // can be null

                                // Need to pass over Message (What to print) Filename, Folder. As this could be writing an Out and a Log file.
    public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

        String sambaSharedPath = SharedPrefs.getserverPath(mContext);
        String sambaUsername = SharedPrefs.getsmbUser(mContext);
        String sambaPass = SharedPrefs.getsmbPass(mContext);
        String sambaIP = SharedPrefs.getserverName(mContext);

      //  String filename = "test.txt";

        SmbConfig cfg = SmbConfig.builder().build();
        SMBClient client = new SMBClient(cfg);
        Connection connection = client.connect(sambaIP);
        Session session = connection.authenticate(new AuthenticationContext(sambaUsername, sambaPass.toCharArray(), sambaDomain));
        DiskShare share = (DiskShare) session.connectShare(sambaSharedPath);

        // this is com.hierynomus.smbj.share.File !
        File f = null;
        int idx = filename.lastIndexOf("/");

        // if file is in folder(s), create them first
        if (idx > -1) {
            String folder = Folder+"\\"+filename.substring(0, idx);
            try {
                if (!share.folderExists(folder)) share.mkdir(folder);
            } catch (SMBApiException ex) {
                throw new IOException(ex);
            }

        }

        if (!share.fileExists(Folder+"\\"+filename)) {
            f = share.openFile(Folder+"\\"+filename,
                    new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
                    new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
                    SMB2ShareAccess.ALL,
                    SMB2CreateDisposition.FILE_CREATE,
                    new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE))
            );
        }
        if (f == null){

            f = share.openFile(Folder+"\\"+filename,
                    new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
                    new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
                    SMB2ShareAccess.ALL,
                    SMB2CreateDisposition.FILE_OPEN_IF,
                    new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE)) );

            }

        OutputStream os = f.getOutputStream();
        os.write(message.getBytes());
        os.flush();
        os.close();
        f.close();

    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-01-08 23:13:36

我尝试了各种方法,但都没有成功,我决定不再使用hierynomus.smbj,因为在尝试使用不同的函数时,我在类中遇到了各种错误。并决定使用jcif,并立即工作,没有任何问题。

下面是一个代码示例:

代码语言:javascript
复制
// required imports
import android.content.Context;
import java.io.IOException;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

public class NetworkLogon {



    public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

        String sambaSharedPath = SharedPrefs.getserverPath(mContext);
        String sambaUsername = SharedPrefs.getsmbUser(mContext);
        String sambaPass = SharedPrefs.getsmbPass(mContext);
        String sambaIP = SharedPrefs.getserverName(mContext);
        try{

            String url = "smb://"+sambaIP+"/"+ sambaSharedPath +"/"+ Folder +"/"+ filename;
            NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
                    null, sambaUsername, sambaPass);
            SmbFile sfile = new SmbFile(url, auth);

            SmbFileOutputStream sfos = new SmbFileOutputStream(sfile, true);

            sfos.write((message+"\n").getBytes());
            sfos.close();

        }catch(Exception e){
            throw new IOException(e);
        }

    }
}

对任何新手的代码的解释:

代码语言:javascript
复制
public static void main(Context mContext, String message, String filename, String Folder) throws IOException {

Context mContext,String message filename Folder用于传递调用位置的内容:示例:

代码语言:javascript
复制
                    String Folder ="Logs";
                    String message = timedateFormat+": Login Failed, Details are incorrect";
                    String filename = dateNow+"-AndroidHandHeld.log";
                    NetworkLogon.main(mContext, message, filename, Folder);

你当然可以自由输入:

代码语言:javascript
复制
NetworkLogon.main(mContext, "Yourmessage", "Somefilename", "SomeFolder");

代码的SharedPrefs部分是另一个获取SharedPreferences中存储的详细信息的类。

字符串url将网络路径、共享文件夹、文件夹和文件名放在一起。

NtlmPasswordAuthentication启动身份验证。我的代码中的参数( Domain,用户名,密码)显示域为空,因为我目前还没有完成域的定义。

SmbFile使用路径+身份验证方法进行连接。

Outputstream正在设置文件并说要追加

然后,其他两行写出该文件并关闭该文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59643352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档