0

私の c# プログラム (Visual Studio 2010 を使用) で、SharePoint ドキュメント ライブラリにファイルをアップロードしています。ファイルをアップロードするには、まずファイルのバイトを byte[] 配列に読み込みます。次に、配列をファイルとしてドキュメント ライブラリにアップロードします。各ファイルをアップロードする前にメモリをクリアする方法が必要です。

プログラムは、ディレクトリ内で繰り返されるループでファイルをアップロードします。byte[] 配列のメモリをクリアする方法はありますか?

実際、プロセス「sqlservr.exe*32」を再起動してメモリを解放する方法はありますか?

これは、アップロードに使用するコードです。

そして、私がウェブサイトに表示するエラーメッセージは次のとおりです(問題が発生した場合、メモリ不足であると思われます。メッセージ内の別のファイルも時々表示されます):URL 'Test Library/myfolder/file.txt' は無効です. 存在しないファイルまたはフォルダを参照しているか、現在の Web にない有効なファイルまたはフォルダを参照している可能性があります。

using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.IO;
using Microsoft.SharePoint;

namespace CustomApplicationPage.Layouts.CustomApplicationPage
{
    public partial class CustomApplicationPage : LayoutsPageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            // Check if user posted a file
            if (File1.PostedFile == null)
            {
                return;
            }

            try
            {
                // Get the directories in the path
                string[] array1 = Directory.GetDirectories("C:\\myfolder\\");

                // Declare variables
                string[] temp;
                byte[] contents;
                string dir_name;
                string file_name;
                int i, j;
                int chunk_size = 5;
                int chunk_index = 0;
                int start_id = chunk_size * chunk_index;  
                int end_id = 1 + (chunk_size * (chunk_index+1));

                // Free the memory
                GC.Collect();

                // For each directory in the main path
                for (i = 0; i < array1.Length; i++)
                {
                    // Get directory name
                    dir_name = Path.GetFileName(array1[i]);

                    // Skip this file
                    if (dir_name == "viDesktop_files" || i < start_id || i >= end_id)
                    {
                        continue;
                    }

                    // Get the site
                    SPSite site = new Microsoft.SharePoint.SPSite("http://mysite/");

                    // Turn security off
                    Microsoft.SharePoint.Administration.SPWebApplication webApp = site.WebApplication;
                    webApp.FormDigestSettings.Enabled = false;

                    // Get site root
                    SPWeb spWeb = site.RootWeb;

                    // Get the specified list/library from the site root
                    SPList docLib = spWeb.Lists["Test Library"];

                    // Get all files in the directory
                    temp = Directory.GetFiles(array1[i]);

                    // Create a folder in the list/library
                    SPListItem folder = docLib.Folders.Add(docLib.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, dir_name);

                    // Activate the newly created folder
                    folder.Update();

                    // For each file in the directory
                    for (j = 0; j < temp.Length; j++)
                    {
                        // Get file name
                        file_name = Path.GetFileName(temp[j]);

                        // If the file is a .mht file
                        if (file_name.EndsWith(".mht"))
                        {
                            // Read the contents of the uploaded file into the variable 'contents'
                            contents = File.ReadAllBytes(temp[j]);

                            // Add the file with the specified filename in the folder
                            SPFile file = folder.Folder.Files.Add(file_name, contents);

                            // Activate the file
                            file.Update();
                        }
                    }

                    // Turn security on
                    webApp.FormDigestSettings.Enabled = true;

                    // Close the site
                    site.Close();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
4

2 に答える 2

0

結果を解放して接続を閉じます...プロセスを再開できますが、より大きな問題が発生する可能性があります...LINQとDataContextを使用してみてください

http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx

すべてが正しくセットアップされていると思われる場合は、SQLプロファイラーを使用して、DBレベルで何が起こっているかを確認してください...

http://msdn.microsoft.com/en-us/library/ms181091.aspx

于 2012-06-13T17:07:04.773 に答える
0

サイト、webApp、spWeb、docLib、フォルダー、ファイル、およびその他の使い捨て可能なもので .Dispose() を呼び出してみてください。

他のアプリケーションによって消費されるメモリが原因で、アプリケーションが OutOfMemoryException を受け取ることはほとんどありません。Windows は必要に応じて仮想メモリを使用し、他のアプリケーションのメモリをページファイルに配置します。32 ビット プロセスでは、アプリケーションで 2G のメモリを使用できる必要があります (使用可能な RAM がそれほど多くない場合でも)。

OutOfMemory 例外で見たものから、それらは通常、断片化のために、clr が、しようとしていることに十分な大きさの連続したメモリのチャンクをアプリケーションに与えることができないことに起因します。

とにかく、使い捨てのものを処分することから始めるべきです。

そして、ところで... GC.Collect(); を呼び出す必要はありません。

于 2012-06-13T19:13:07.483 に答える