2011-05-05 21 views
8

Geçerli sistem dosyası önbellek boyutunu aşağıda gösterildiği gibi almaya çalışıyorum. Ancak bu kodu çalıştırdığımda hiçbir şey iade edilmez, nerede yanlış gittiğimi kimse göremez mi? FYI bağlantı GetSystemFileCache. Benim içinC# sistem dosya önbellek boyutu alın

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
    public static extern bool GetSystemFileCacheSize(
     ref IntPtr lpMinimumFileCacheSize, 
     ref IntPtr lpMaximumFileCacheSize, 
     ref IntPtr lpFlags 
     ); 

    static void Main(string[] args) 
    {    
     IntPtr lpMinimumFileCacheSize = IntPtr.Zero; 
     IntPtr lpMaximumFileCacheSize = IntPtr.Zero; 
     IntPtr lpFlags = IntPtr.Zero; 

     bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags); 
    } 
+4

üzerine koydu ettik Bu işlev için http://pinvoke.net. (Kernel32.dll alt menüsüne gidin). Çalışırsanız, lütfen bu siteye bir örnek ekleyin (bu bir wiki). –

+0

Hatayı almak için daha sonra GetLastWin32Error'u aramayı denediniz mi? –

+0

Üzgünüm - Tamamen uyuşturucu, hala X86'a ayarlanmış bir hedef platformu vardı. Şimdi utanıyorum. Bir CPU'ya ayarlandığında, iyi çalışıyor. – Johnv2020

cevap

5
 bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags); 

     Console.WriteLine(lpMinimumFileCacheSize); 
     Console.WriteLine(lpMaximumFileCacheSize); 

İşleri cezası.

1048576 
2143289344 

Windows 7 Pro x32

+0

a) Hangi rakamlar (yaklaşık)? ve b) 32 | 64 bit işletim sistemi? –

+0

Tamam, Win7 x64 üzerinde 0 0 var. Ve b == false –

+0

@Henk, x64 win 7 var, daha sonra snippet'inizi deneyeceğim. –

2

Bu kod parçacığı çalışır: (Windows Yedi x86) enter image description here

2

sorunun biz MS KB 976618 ve bağlı ilgili karşılaşıyorsanız Çünkü Çıktı

üretim sunucularında bilinmeyen üçüncü taraflardan ikili kod çalıştırmak istemiyorum C# diline zorlanıyorum. Çünkü ben C# 'da bir newb olduğumu bir süre aldı ama nihayet insanların gönderdiği kod parçacıklarının etrafındaki fazla bitleri anladım. Yani derler ve ishal benim tam ms visual studio C# konsol programıdır: my Windows 7 x64 PC'de

using System; 
using System.Runtime.InteropServices; 

class Program 
{ 
    [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
    public static extern bool GetSystemFileCacheSize(
     ref IntPtr lpMinimumFileCacheSize, 
     ref IntPtr lpMaximumFileCacheSize, 
     ref IntPtr lpFlags 
     ); 

    static void Main(string[] args) 
    { 
     IntPtr lpMinimumFileCacheSize = IntPtr.Zero; 
     IntPtr lpMaximumFileCacheSize = IntPtr.Zero; 
     IntPtr lpFlags = IntPtr.Zero; 

     bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags); 

     Console.WriteLine(b); 
     Console.WriteLine(lpMinimumFileCacheSize); 
     Console.WriteLine(lpMaximumFileCacheSize); 
     Console.WriteLine(lpFlags); 
    } 
} 

ve

 
True 
1048576 
1099511627776 
0 

verir ve hayır, bu üretim sunucusu değil.

ve sonra powershell bu

$source = @" 
using System; 
using System.Runtime.InteropServices; 

namespace MyTools 
{ 
    public static class cache 
    { 

     [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] 
     public static extern bool GetSystemFileCacheSize(
      ref IntPtr lpMinimumFileCacheSize, 
      ref IntPtr lpMaximumFileCacheSize, 
      ref IntPtr lpFlags 
      ); 

     public static bool Get(ref IntPtr a, ref IntPtr c, ref IntPtr d) 
     { 
      IntPtr lpMinimumFileCacheSize = IntPtr.Zero; 
      IntPtr lpMaximumFileCacheSize = IntPtr.Zero; 
      IntPtr lpFlags = IntPtr.Zero; 

      bool b = GetSystemFileCacheSize(ref lpMinimumFileCacheSize, ref lpMaximumFileCacheSize, ref lpFlags); 

      a = lpMinimumFileCacheSize; 
      c = lpMaximumFileCacheSize; 
      d = lpFlags; 
      return b; 
     } 
    } 
} 
"@ 

Add-Type -TypeDefinition $source -Language CSharp 

# Init variables 
$SFCMin = 0 
$SFCMax = 0 
$SFCFlags = 0 
$b = [MyTools.cache]::Get([ref]$SFCMin, [ref]$SFCMax, [ref]$SFCFlags) 

#typecast values so we can do some math with them 
$SFCMin = [long]$SFCMin 
$SFCMax = [long]$SFCMax 
$SFCFlags = [long]$SFCFlags 

write-output "Return values from GetSystemFileCacheSize are: " 
write-output "Function Result : $b" 
write-output "   Min : $SFCMin" 
write-output ("   Max : $SFCMax (" + $SFCMax/1024/1024/1024 + " GiB)") 
write-output "   Flags : $SFCFlags" 

Sonraki adımdır: SetSystemFileCacheSize, bunun için bir powershell komut dosyası yazılı ve üzerinde bir örnek yoktur şaşırdım https://serverfault.com/questions/325277/windows-server-2008-r2-metafile-ram-usage/527466#527466