当前位置: 首页 > 知识库问答 >
问题:

使用Jackcess和JCIFS操作SMB共享上的Access数据库

汪欣德
2023-03-14
    String testdirectory = "smb://" + "file location"; 

    SmbFile testsmbdir = null;

    try{
            testsmbdir = new SmbFile(testdirectory,auth);
    }catch(Exception e){
                e.printStackTrace();
    }


    SmbFileInputStream smbFilestream = new SmbFileInputStream(testsmbdir);
    db = DatabaseBuilder.open(testsmbdir);
db = DatabaseBuilder.open(testsmbdir)" 

我必须将文件复制到本地机器还是完全不同的东西?如果我怎么做?

(顺便说一句,我是一个windows用户。我只是在把我的应用程序转换到Mac上,如果我的行话用错了,很抱歉。)

共有1个答案

端木震博
2023-03-14

在回答Jackcess论坛上的一个帖子时,James建议

实现与SmbRandomAccessFile一起工作的FileChannel版本应该比较简单

我刚刚在Eclipse中的一个名为smb4jackcess的Maven项目中尝试了它,我不需要编写太多代码就能让它工作。我创建的类名为SMBFileChannel:

// FileChannel using jcifs.smb.SmbRandomAccessFile

package smb4jackcess;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbRandomAccessFile;

public class SmbFileChannel extends FileChannel {
    private final SmbRandomAccessFile _file;
    private long _length;

    public SmbFileChannel(String smbURL) throws SmbException, MalformedURLException, UnknownHostException {
        _file = new SmbRandomAccessFile(smbURL, "rw", SmbFile.FILE_NO_SHARE);
        _length = _file.length();
    }

    @Override
    public void force(boolean metaData) throws SmbException, MalformedURLException, UnknownHostException {
        // do nothing
    }

    @Override
    public FileLock lock(long position, long size, boolean shared) {
        throw new UnsupportedOperationException();
    }

    @Override
    public MappedByteBuffer map(MapMode mode, long position, long size) {
        throw new UnsupportedOperationException();
    }

    @Override
    public long position() throws SmbException {
        return _file.getFilePointer();
    }

    @Override
    public FileChannel position(long newPosition) throws SmbException {
        _file.seek(newPosition);
        return this;
    }

    @Override
    public int read(ByteBuffer dst) {
        throw new UnsupportedOperationException();
    }

    @Override
    public int read(ByteBuffer dst, long position) throws SmbException {
        byte[] b = new byte[dst.remaining()];
        _file.seek(position);
        int bytesRead =_file.read(b);
        dst.put(b);
        return bytesRead;
    }

    @Override
    public long read(ByteBuffer[] dsts, int offset, int length) {
        throw new UnsupportedOperationException();
    }

    @Override
    public long size() throws SmbException {
        return _length;
    }

    @Override
    public long transferFrom(ReadableByteChannel src, long position, long count) throws IOException {
        ByteBuffer bb = ByteBuffer.allocate((int)count);
        int bytesWritten = src.read(bb);
        bb.rewind();
        bb.limit(bytesWritten);
        this.write(bb, position);
        return bytesWritten;
    }

    @Override
    public long transferTo(long position, long count, WritableByteChannel target) {
        throw new UnsupportedOperationException();
    }

    @Override
    public FileChannel truncate(long newSize) throws SmbException {
        if (newSize < 0L) {
            throw new IllegalArgumentException("negative size");
        }
        _file.setLength(newSize);
        _length = newSize;
        return this;
    }

    @Override
    public FileLock tryLock(long position, long size, boolean shared) {
        throw new UnsupportedOperationException();
    }

    @Override
    public int write(ByteBuffer src) throws SmbException {
        throw new UnsupportedOperationException();
    }

    @Override
    public int write(ByteBuffer src, long position) throws SmbException {
        byte[] b = new byte[src.remaining()];
        src.get(b);
        _file.seek(position);
        _file.write(b);

        long endPos = position + b.length;
        if(endPos > _length) {
            _length = endPos;
        }

        return b.length;
    }

    @Override
    public long write(ByteBuffer[] srcs, int offset, int length) {
        throw new UnsupportedOperationException();
    }

    @Override
    protected void implCloseChannel() throws SmbException {
        _file.close();
    }

}
package smb4jackcess;

import java.nio.channels.FileChannel;

import com.healthmarketscience.jackcess.Column;
import com.healthmarketscience.jackcess.ColumnBuilder;
import com.healthmarketscience.jackcess.DataType;
import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.Database.FileFormat;
import com.healthmarketscience.jackcess.DatabaseBuilder;
import com.healthmarketscience.jackcess.IndexBuilder;
import com.healthmarketscience.jackcess.Table;
import com.healthmarketscience.jackcess.TableBuilder;

public class Smb4jackcessMain {

    public static void main(String[] args) {

        String smbURL = "smb://gord:mypassword@SERVERNAME/sharename/etc/newdb.accdb";
        try (SmbFileChannel sfc = new SmbFileChannel(smbURL)) {

            // create a brand new database file                
            Database db = new DatabaseBuilder()
                    .setChannel(sfc)
                    .setFileFormat(FileFormat.V2010)
                    .create();

            // add a table to it
            Table newTable = new TableBuilder("NewTable")
                    .addColumn(new ColumnBuilder("ID", DataType.LONG)
                            .setAutoNumber(true))
                    .addColumn(new ColumnBuilder("TextField", DataType.TEXT))
                    .addIndex(new IndexBuilder(IndexBuilder.PRIMARY_KEY_NAME)
                            .addColumns("ID").setPrimaryKey())
                    .toTable(db);

            // insert a row into the table
            newTable.addRow(Column.AUTO_NUMBER, "This is a new row.");

            db.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }

    }

}
 类似资料:
  • 我想将本地目录(包括子目录)的所有内容复制到samba共享。 有没有一个简单的方法可以做到这一点?类似于SMB文件的内容。当源和目标位于SMB上时,copyTo()。

  • 本文向大家介绍VB使用ADO操作Access数据库,包括了VB使用ADO操作Access数据库的使用技巧和注意事项,需要的朋友参考一下 这里只是个简单不能再简单的VB小程序实例,但它包含这几个关键字:VB6.0、ADO、Access 环境:visual basic 6.0 企业版(非精简版,不然会缺少必须的控件) 数据库:Access数据库,数据库是xs.mbd,内建表为xj 结果:vb使用ADO

  • 我在新的Android项目中使用JCIFS。不知何故,我决定使用URL类来泛化文件路径(以便以后可以添加更多协议)。我所做的如下 然后抛出java.net.MalformedURLExcure异常。 参考JCIFS FAQ可以发现,在使用该类之前,我必须注册协议。然而,我真的不知道如何在Android中做到这一点。我认为这个库已经做到了,但在Android上没有。 那么我该怎么做呢?

  • 此外,如果我可以动态地改变它,那么我需要这样做的迹象是什么?任何特定的异常或场景指出需要或? 谢了!

  • 我使用JCIFS SMB上传SMB文件时遇到性能问题。问题与属性并使用修复了该问题。 现在的问题是,在这种情况下,我将在使用因为它对我来说必须是静态属性?我有许多使用相同配置的不同环境。 属性文档(链接)说: 如果此属性为true,则将禁用基于域的DFS引用。默认值为false。此属性在非域环境中可能很重要,在非域环境中,通常在JCIFS首次尝试解析路径时运行的基于域的DFS引用将超时,从而导致长

  • 有人能帮我把文件从共享文件夹复制到本地驱动器吗?我的代码是: 文件未被复制。我收到一条消息“无法连接到服务器”,但程序显示dir。源文件的getDate()(以及文件名和长度)。因此,我认为目标文件夹(C:/SQLRESTORESTAGE/)存在问题。此外,我也提供了只用于读取源文件。你能帮我纠正一下密码或者给点建议吗?非常感谢。