繁体   English   中英

通过网络附加文本文件 Android API SDK min 19

[英]Appending Text file over network Android API SDK min 19

我对 Java 比较陌生,并且在附加到文本文件时遇到了一些困难。 我能够创建和写入它,但是如果文件存在,我只能覆盖它。

我试图使用 StandardOpenOption 但这需要 SDK 26(并且我正在为 Android 7 开发)这意味着由于 Min SDK,我无法使用 StandardOpenOption。

我还有其他方法可以实现这一目标吗? 这是我当前正在运行的代码,这是使用 hierynomus 访问 Windows 网络路径

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();

    }
}

我尝试了各种方法但没有成功,我决定不再使用 hierynomus.smbj,因为我在尝试使用不同功能时在课堂上遇到了各种错误。 并决定使用 jcifs,并且立即没有任何问题地工作。

代码示例:

// 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);
        }

    }
}

任何新人的代码解释:

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

Context mContext, String message filename 文件夹用于从它被调用的地方传递内容: 一个例子:

                    String Folder ="Logs";
                    String message = timedateFormat+": Login Failed, Details are incorrect";
                    String filename = dateNow+"-AndroidHandHeld.log";
                    NetworkLogon.main(mContext, message, filename, Folder);

你当然可以自由输入:

NetworkLogon.main(mContext, "Yourmessage", "Somefilename", "SomeFolder");

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

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

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

SmbFile 使用 path + auth 方法连接。

输出流正在设置文件并说要追加

然后另外两行将文件写出并关闭文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM