间歇性将文件上传到Google驱动器失败

时间:2018-12-26 07:38:49

标签: c# google-drive-api

使用Google Drive API上传文件。多个相同的控制台应用程序同时运行以上传文件夹中文件的不同部分,并且它们的文件不重叠。这达到了配额限制。然后,实施一次while-try-catch以便在由于配额限制而引发异常时重新执行查询。列表和创建目录方法效果很好,但上载(即创建)方法效果不好。当我从Google云端硬盘站点检查时,某些文件丢失了

尝试使用FileStream代替MemoryStream,但似乎无关。

public class RateLimitingRequestBody extends RequestBody {

private MediaType mContentType;
private File mFile;
private int mMaxRate;    // ms/bit

private RateLimitingRequestBody(@Nullable final MediaType contentType, final File file, int rate){
    mContentType = contentType;
    mFile = file;
    mMaxRate = rate;
}

@Override
public MediaType contentType() {
    return mContentType;
}

@Override
public void writeTo(BufferedSink sink) throws IOException {

    Source source = null;

    try {
        source = Okio.source(mFile);
        writeAll(sink, source);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        Util.closeQuietly(source);
    }
}


public long writeAll(BufferedSink sink, Source source) throws IOException, InterruptedException {
    if (source == null) {
        throw new IllegalArgumentException("source == null");
    } else {
        long totalBytesRead = 0L;

        long readCount;
        long start = System.currentTimeMillis();
        while((readCount = source.read(sink.buffer(), 8192L)) != -1L) {
            totalBytesRead += readCount;
            sink.emitCompleteSegments();

            long time = System.currentTimeMillis();
            if(time == start) continue;
            long rate = (totalBytesRead * 8) / (time - start);
            NLog.v("writeAll","totalBytesRead:"+totalBytesRead+"B "+ " Rate:"+rate*1000+"bits");

            if(rate > mMaxRate/1000){
                int sleep = (int) (totalBytesRead * 8 * 1000 / mMaxRate - (time - start));
                NLog.d("writeAll", "sleep:"+sleep);
                Thread.sleep(sleep+50);
            }
        }

        long end = System.currentTimeMillis();
        long rate = (totalBytesRead * 8 * 1000) / ((end - start));
        NLog.e("writeAll","totalBytesRead:"+totalBytesRead+"B "+ " Rate:"+rate+"bits"+" total time:"+(end-start));
        return totalBytesRead;
    }
}


public static RequestBody createRequestBody(@Nullable final MediaType contentType, final File file, int rate) {
    if (file == null) {
        throw new NullPointerException("content == null");
    } else {
        return new RateLimitingRequestBody(contentType, file, rate);
    }
}

0 个答案:

没有答案